.net 如何正确覆盖DataGridViewCheckBox.Value?

.net 如何正确覆盖DataGridViewCheckBox.Value?,.net,winforms,datagridview,.net,Winforms,Datagridview,我试图覆盖DataGridViewCheckBox,以便它从对象是否在集合(本质上是谓词)中获取其布尔值,并在设置该值时,根据需要从集合中添加/删除该对象 此外,我希望在显示复选框时选中该值(但在分配DataGridView之前,我无法设置该值)。我在CheckBoxCell上尝试了各种方法重写组合(GetValue/SetValue似乎不起作用),我尝试的任何解决方案似乎都非常复杂 以这种方式重写checkboxcell值的最佳、最合理和最不粗糙的方法是什么?我想您可以创建一个自定义MyDat

我试图覆盖DataGridViewCheckBox,以便它从对象是否在集合(本质上是谓词)中获取其布尔值,并在设置该值时,根据需要从集合中添加/删除该对象

此外,我希望在显示复选框时选中该值(但在分配DataGridView之前,我无法设置该值)。我在CheckBoxCell上尝试了各种方法重写组合(GetValue/SetValue似乎不起作用),我尝试的任何解决方案似乎都非常复杂


以这种方式重写checkboxcell值的最佳、最合理和最不粗糙的方法是什么?

我想您可以创建一个自定义MyDataGridViewCheckBoxCell,并重写其GetFormattedValue以返回true\false,具体取决于集合中存在的单元格值;和SetValue来修改集合。请看下面的例子是否适合您;不确定这是否是最好的方法,但可以肯定的是,这不是黑客行为:)

private static List ItemsList=new List();
...
//填写收集清单
AddRange(新字符串[]{“a”,“c”});
//创建列
DataGridViewTextBoxColumn0=新DataGridViewTextBoxColumn()
{HeaderText=“column1”,DataPropertyName=“column1”};
DataGridViewCheckBoxColumn Column 1=新建DataGridViewCheckBoxColumn()
{HeaderText=“column2”,DataPropertyName=“column2”};
dataGridView1.Columns.AddRange(新的System.Windows.Forms.DataGridViewColumn[]{column0,column1});
//创建数据行
dataSet1.Tables[0].Rows.Add(新对象[]{“a”,“a”});
dataSet1.Tables[0].Rows.Add(新对象[]{“b”,“b”});
dataSet1.Tables[0].Rows.Add(新对象[]{“c”,“c”});
...
//自定义datagridview复选框单元格
公共类MyDataGridViewCheckBoxCell:DataGridViewCheckBoxCell
{
公共MyDataGridViewCheckBoxCell()
{
FalseValue=false;
真值=真;
}
受保护的覆盖对象GetFormattedValue(对象值,
整数行索引,
参考DataGridViewCellStyle单元样式,
类型转换器值类型转换器,
TypeConverter formattedValueTypeConverter,
DataGridViewDataErrorContext(上下文)
{
//检查值是否为string且在列表中;如果为true,则返回true
对象结果=(值为字符串)?Form1.ItemsList.IndexOf((字符串)值)>-1:值;
返回base.GetFormattedValue(结果、行索引、引用单元格样式、,
valueTypeConverter,格式化的valueTypeConverter,上下文);
}
受保护的覆盖布尔设置值(整数行索引,对象值)
{
if(值!=null)
{
//更改集合
if(值等于(真))
Form1.ItemsList.Add((字符串)值);
其他的
Form1.ItemsList.Remove((字符串)值);
//将列表转储到控制台
foreach(Form1.ItemsList中的字符串项)
写入(“{0}\t”,项);
Console.WriteLine();
}
返回true;
}
}        
//自定义datagridview列
公共类NewDataGridViewCheckBoxColumn:DataGridViewCheckBoxColumn
{
public NewDataGridViewCheckBoxColumn()
{
CellTemplate=新建MyDataGridViewCheckBoxCell();
}
}
希望这有帮助,谢谢

private static List<string> ItemsList = new List<string>();
...
// fill in collection list
ItemsList.AddRange(new string[] { "a", "c" });
// create columns
DataGridViewTextBoxColumn column0 = new DataGridViewTextBoxColumn() 
    {  HeaderText = "column1", DataPropertyName = "Column1"};
DataGridViewCheckBoxColumn column1 = new NewDataGridViewCheckBoxColumn()
    {  HeaderText = "column2", DataPropertyName = "Column2"};
dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { column0, column1 });
// create data rows
dataSet1.Tables[0].Rows.Add(new object[] {"a", "a" });
dataSet1.Tables[0].Rows.Add(new object[] { "b", "b" });
dataSet1.Tables[0].Rows.Add(new object[] { "c", "c" });
...
// custom datagridview checkbox cell
public class MyDataGridViewCheckBoxCell : DataGridViewCheckBoxCell 
{
    public MyDataGridViewCheckBoxCell()
    {
        FalseValue = false;
        TrueValue = true;
    }

    protected override Object GetFormattedValue(Object value,
        int rowIndex,
        ref DataGridViewCellStyle cellStyle,
        TypeConverter valueTypeConverter,
        TypeConverter formattedValueTypeConverter,
        DataGridViewDataErrorContexts context)
    {
        // check if value is string and it's in the list; return true if it is
        object result = (value is string) ? Form1.ItemsList.IndexOf((string)value) > -1 : value;
        return base.GetFormattedValue(result, rowIndex, ref cellStyle, 
            valueTypeConverter, formattedValueTypeConverter, context);
    }

    protected override bool SetValue(int rowIndex, Object value)
    {
        if (value!=null)
        {
            // change collection
            if (value.Equals(true))
                Form1.ItemsList.Add((string)Value);
            else
                Form1.ItemsList.Remove((string)Value);

            // dump list into console
            foreach (string item in Form1.ItemsList)
                Console.Write("{0}\t", item);
            Console.WriteLine();
        }
        return true;
    }
}        
// custom datagridview column     
public class NewDataGridViewCheckBoxColumn : DataGridViewCheckBoxColumn
{
    public NewDataGridViewCheckBoxColumn()
    {
        CellTemplate = new MyDataGridViewCheckBoxCell();
    }
}