2013-08-30 8 views
1

У меня есть datagridview, который имеет несколько столбцов textboxtype и один столбец checkboxtype. CheckBoxColumn связывается с свойством типа bool.Как скрыть конкретную ячейку флажка в datagridview

Я хочу, чтобы, если флажок установлен, он видит в сетке иначе, как показано на рисунке.

enter image description here

Я добавил код в полной привязки данных, но он дает ошибку компиляции "Property or indexer 'System.Windows.Forms.DataGridViewCell.Visible' cannot be assigned to -- it is read only"

private void dgvleftEdit_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    var reportLogoList = cWShowInvoicePaymentDetailsBindingSource.List as IList<CWShowInvoicePaymentDetails>; 

    foreach (DataGridViewRow row in dgvleftEdit.Rows) 
    { 
     var objReport = row.DataBoundItem as CWShowInvoicePaymentDetails; 
     var findItem = from f in reportLogoList 
         //where f.fReportID == objReport.fKey 
         select f; 
     if (objReport.IsImage == false) 
     { 
      this.dgvleftEdit.Rows[row.Index].Cells[7].Visible = false; 
     } 
     else 
     { 
      this.dgvleftEdit.Rows[row.Index].Cells[7].Visible = true; 
     } 
    } 
} 

время Можно ли скрыть определенную ячейку в DataGridView?

+0

Вы хотите скрыть ячейки фальшивых флагов, так как вы можете их проверить? Или вам просто нужно показать ячейки флажка без взаимодействия? –

+0

он исходит из базы данных. Если IsImage истинно в БД, он проверяется в Datagribview. –

+0

Я также пробовал "this.dgvleftEdit [" IsImage ", row.Index] = новый DataGridViewTextBoxCell();" но в ячейке он показывает true или false как текст. –

ответ

2

Я думаю, что это то, что вы хотите, если не оставить какой-то комментарий, почему:

//CellPainting event handler for your dataGridView1 
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { 
    if (e.ColumnIndex > -1 && e.RowIndex > -1 && dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){ 
    if (e.Value == null || !(bool)e.Value) { 
     e.PaintBackground(e.CellBounds, false); 
     e.Handled = true; 
    } 
    } 
} 
//CellBeginEdit event handler for your dataGridView1 
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e){ 
    if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){ 
      object cellValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value; 
      e.Cancel = cellValue == null || !(bool)cellValue; 
    } 
} 
1

Измените ваш DataGridVIewCheckBoxColumn на DataGridViewImageColumn

Тогда в обработчике datagridview.CellFormatting:

private void datagridview_CellFormatting(object sender, 
              dataGridViewCellFormattingEventArgs e) 
{ 
    if (e.RowIndex >= 0 && dataGridView1.Columns[e.ColumnIndex] is DataGridViewImageColumn) 
    { 
     if (e.Value != null && (bool)e.Value == true) 
     { 
      e.Value = My.Resources.yourCheckedImage; 
     } 
     else 
     { 
      e.Value = null; 
     } 
    } 
} 

Тогда обновление ячейки может обрабатывать обработчик MouseDown или какой-либо другой обработчик Click, Enter ..etc.

private void datagridview_MouseDown(Object sender, MouseEventArgs e) 
{ 
    DataGridView dgv = (DataGridView)sender; 
    DataGridView.HitTestInfo click = dgv.HitTest(e.Location.X, e.Location.Y); 
    //If your have predefined columns, then maybe better compare by Column.name 
    if(click.RowIndex >= 0 && dgv.Columns(click.ColumnIndex) is DataGridViewImageColumn) 
    { 
     DataGridViewCell cellTmp = dgv.Row(click.RowIndex).Cells(click.ColumnIndex); 
     if (cellTmp.Value == null) 
     { 
      cellTmp.Value = My.Resources.yourCheckedImage; 
     } 
     else 
     { 
      cellTmp.Value = null; 
     } 
    } 
} 
Смежные вопросы