C # DataGridViewCheckBoxColumn Hide / Gray-Out - PullRequest
       25

C # DataGridViewCheckBoxColumn Hide / Gray-Out

4 голосов
/ 05 октября 2011

У меня есть DataGridView с несколькими столбцами и несколькими строками данных.Один из столбцов - это DataGridViewCheckBoxColumn, и (основываясь на других данных в строке) я бы хотел, чтобы опция «скрывала» флажок в некоторых строках.Я знаю, как сделать его доступным только для чтения, но я бы предпочел, чтобы он вообще не отображался или, по крайней мере, отображался иначе (серым), чем другие флажки.Это возможно?

Ответы [ 3 ]

12 голосов
/ 05 октября 2011

Некоторое решение: сделайте его доступным только для чтения и измените цвет на серый.Для одной конкретной ячейки:

dataGridView1.Rows[2].Cells[1].Style.BackColor =  Color.LightGray;
dataGridView1.Rows[2].Cells[1].ReadOnly = true;

Или, лучше, но более «сложное» решение:
предположим, что у вас есть 2 столбца: первый с номером, второй с флажком, который не должен быть виден, когда число> 2Вы можете обрабатывать событие CellPainting, рисовать только границы (и, например, фон) и прерывать рисование покоя.Добавьте событие CellPainting для DataGridView (дополнительно проверьте значение DBNull, чтобы избежать исключения при добавлении новых данных в пустую строку):

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    //check only for cells of second column, except header
    if ((e.ColumnIndex == 1) && (e.RowIndex > -1))
    {
        //make sure not a null value
        if (dataGridView1.Rows[e.RowIndex].Cells[0].Value != DBNull.Value)
        {
            //put condition when not to paint checkbox
            if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[0].Value) > 2)
            {
                e.Paint(e.ClipBounds, DataGridViewPaintParts.Border | DataGridViewPaintParts.Background);  //put what to draw
                e.Handled = true;   //skip rest of painting event
            }
        }
    }
}

Это должно работать, однако, если вы измените значение вручную в первом столбце, где вычтобы проверить условие, необходимо обновить вторую ячейку, поэтому добавьте еще одно событие, например CellValueChanged:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0)
    {
        dataGridView1.InvalidateCell(1, e.RowIndex);
    }
}
0 голосов
/ 05 октября 2011

Взято из Настроив внешний вид ячеек в элементе управления Windows Forms DataGridView , вы можете перехватить событие CellPainting и не рисовать ячейку, если она находится в режиме только для чтения.Например:

public Form1()
{
   InitializeComponent();
   dataGridView1.CellPainting += new 
      DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);
}

private void dataGridView1_CellPainting(object sender,
   System.Windows.Forms.DataGridViewCellPaintingEventArgs e)
{
   // Change 2 to be your checkbox column #
   if (this.dataGridView1.Columns[2].Index == e.ColumnIndex && e.RowIndex >= 0)
   {
      // If its read only, dont draw it
      if (dataGridView1[e.ColumnIndex, e.RowIndex].ReadOnly)
      {
         // You can change e.CellStyle.BackColor to Color.Gray for example
         using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
         {
            // Erase the cell.
            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
            e.Handled = true;
         }
      }
   }
}

Единственное предостережение заключается в том, что вам нужно вызвать dataGridView1.Invalidate(); при изменении свойства ReadOnly одного из ячеек DataGridViewCheckBox.

0 голосов
/ 05 октября 2011

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcheckboxcell.aspx

DataGridViewCheckBoxCell.Visible = false;

Редактировать: Ой, подождите, это только для чтения. Derp.

В этом случае попробуйте заменить ячейку на пустой DataGridViewTextBoxCell.

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