我有一个datagridview,其中所有列都被绑定,除了一个复选框列。在我的表单的OnLoad中,我遍历dataGridView中的行,并为每一行设置DataGridViewCheckBoxCell.Value = true
。
我在OnLoad的末尾验证了我设置的所有DataGridViewCheckBoxCells仍然具有我给它们的值,但是一旦显示dataGridView,我设置的所有选定值和复选框值都会重置。
答案 0 :(得分:2)
显然,当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);
}
}
}
}
}