Как правильно переопределить DataGridViewCheckBox.Value? - PullRequest
0 голосов
/ 17 декабря 2009

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

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

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

1 Ответ

1 голос
/ 19 декабря 2009

Полагаю, вы можете создать собственный 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();
    }
}

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...