2009-12-17 3 views
0

Я пытаюсь переопределить DataGridViewCheckBox так, что он берет его логическое значение от того, находится ли объект в коллекции (по существу предикат), а когда значение установлено, оно добавляет/удаляет объект из коллекции по мере необходимости.Как правильно переопределить DataGridViewCheckBox.Value?

Кроме того, я хочу, чтобы это значение было проверено, когда отображается флажок (но я не могу установить значение до тех пор, пока не будет назначен DataGridView). Я пробовал различные комбинации переопределений методов в CheckBoxCell (GetValue/SetValue, похоже, не работает), и любое решение, которое я пытаюсь сделать, кажется, нереально сложным.

Какой лучший, самый разумный и наименее хакерский способ переопределить значение checkboxcell таким образом?

ответ

1

Я думаю, вы можете создать собственный MyDataGridViewCheckBoxCell и переопределить его GetFormattedValue, чтобы вернуть true \ false в зависимости от значения ячейки существования в вашей коллекции; и SetValue для изменения коллекции. Посмотрите, подходит ли пример ниже для вас; не уверен, что это лучший способ сделать это, но это не Hacky это точно :)

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(); 
    } 
} 

надеюсь, что это помогает, считает