绑定dataGridView中的未绑定列不保存单元格值

时间:2012-06-19 20:21:19

标签: c# winforms datagridview bindingsource datagridviewcheckboxcell

我有一个datagridview,其中所有列都被绑定,除了一个复选框列。在我的表单的OnLoad中,我遍历dataGridView中的行,并为每一行设置DataGridViewCheckBoxCell.Value = true

我在OnLoad的末尾验证了我设置的所有DataGridViewCheckBoxCells仍然具有我给它们的值,但是一旦显示dataGridView,我设置的所有选定值和复选框值都会重置。

1 个答案:

答案 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);
            }
        }
    }
}

}