我有一个 datagridview,其中除了一个复选框列之外的所有列都被绑定(bind)。在表单的 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);
}
}
}
}
}
关于c# - 绑定(bind) dataGridView 中的未绑定(bind)列不保存单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108778/