c# - 绑定(bind) dataGridView 中的未绑定(bind)列不保存单元格值

标签 c# winforms datagridview bindingsource datagridviewcheckboxcell

我有一个 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/

相关文章:

c# - ListView Final Column Autosize 创建滚动条

c# - 在 C# windows.Form 中使用的自定义 .ttf 字体

winforms - WinForms DataGridView 中的水平滚动条

c# - 如何在 DataGridViewCell 中设置字符串的方向?

c# - 如何在 Mac OS 中注册服务?

c# - 为什么我收到错误 Cannot await 'void' ?

c# - 如何在启动时处理表单显示顺序

c# - 单击按钮隐藏/显示部分窗口

c# - 数据未进入 datagridview

c# - C#中常数值计算错误溢出