我有一个datagridview,除了一个复选框列之外,所有列都绑定了。在我的表单的 OnLoad 中,我浏览了我的 dataGridView 中的行并DataGridViewCheckBoxCell.Value = true
为每一行设置。
我在 OnLoad 结束时验证了我设置的所有 DataGridViewCheckBoxCells 仍然具有我给它们的值,但是一旦显示 dataGridView,我设置的所有选定值和复选框值都会重置。
我有一个datagridview,除了一个复选框列之外,所有列都绑定了。在我的表单的 OnLoad 中,我浏览了我的 dataGridView 中的行并DataGridViewCheckBoxCell.Value = true
为每一行设置。
我在 OnLoad 结束时验证了我设置的所有 DataGridViewCheckBoxCells 仍然具有我给它们的值,但是一旦显示 dataGridView,我设置的所有选定值和复选框值都会重置。
显然,当 DataGridView 变得可见时(Visible = true
),OnBindingContextChanged
被调用导致内部数据连接被重置并重置所有单元格上的值。
因此,我没有在表单中设置单元格的值,而是在我的数据网格上OnLoad
设置VirtualMode = true
并覆盖OnCellValueNeeded
我可以按需提供复选框单元格值的位置。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace MyControls
{
public class SelectedItemsGridView : DataGridView
{
private IList _SelectedItems;
public IList SelectedItems
{
get { return _SelectedItems; }
set
{
_SelectedItems = value;
ClearSelection();
Refresh();
}
}
public SelectedItemsGridView()
: base()
{
SelectionMode = DataGridViewSelectionMode.FullRowSelect;
RowHeadersVisible = false;
VirtualMode = true;
////Columns.Add(new DataGridViewCheckBoxColumn(false) {
// AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
// HeaderText = "Select"});
}
protected override void OnCreateControl()
{
base.OnCreateControl();
if (DesignMode == true) { return; }
Columns.Insert(0, new DataGridViewCheckBoxColumn(false)
{
AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
HeaderText = "Select"
});
}
public bool IsItemSelected(object obj)
{
if (SelectedItems == null) { return false; }
return SelectedItems.Contains(obj);
}
protected override void OnCellValueNeeded(DataGridViewCellValueEventArgs e)
{
base.OnCellValueNeeded(e);
if (e.ColumnIndex == 0)
{
e.Value = IsItemSelected((this.DataSource as IList)[e.RowIndex]);
}
}
protected override void OnCellContentClick(DataGridViewCellEventArgs e)
{
base.OnCellContentClick(e);
if (e.RowIndex == -1) { return; }
Object item = ((IList)DataSource)[e.RowIndex];
if(e.ColumnIndex == 0)
{
var cellValue = this[e.ColumnIndex, e.RowIndex].Value;
if (cellValue != null && (bool)cellValue == true)
{
SelectedItems.Remove(item);
}
else if (cellValue != null && (bool)cellValue == false)
{
SelectedItems.Add(item);
}
}
}
}
}