2009-12-17 8 views
0

DataGridViewCheckBox를 재정의하여 개체가 컬렉션 (본질적으로 술어)에 있는지 여부를 부울 값으로 취하고 값을 설정하면 컬렉션에서 개체를 적절하게 추가/제거합니다.어떻게 DataGridViewCheckBox.Value를 제대로 재정의합니까?

또한 확인란을 표시 할 때이 값을 확인하고 싶지만 DataGridView가 할당 될 때까지 값을 설정할 수 없습니다. CheckBoxCell (GetValue/SetValue 작동하지 않는 것) 메서드 오버라이드 다양한 조합을 시도한 및 불필요하게 복잡하게 보이는 모든 솔루션을 보인다.

이렇게하면 checkboxcell 값을 무시하는 가장 좋은, 가장 현명한 방법은 무엇입니까?

답변

1

사용자 지정 MyDataGridViewCheckBoxCell을 만들고 GetFormattedValue를 재정 의하여 컬렉션의 존재 셀 값에 따라 true \ false를 반환 할 수 있습니다. SetValue를 사용하여 컬렉션을 수정합니다. 아래 예제가 잘 작동하는지 확인하십시오. 그것은이 작업을 수행하는 가장 좋은 방법이지만 그이 도움이 확인 :

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

희망의 해키되어 있지 않은 경우 확실하지가

에 관하여