我有一个DataGridView
,其中有几列和几行数据。其中一列是DataGridViewCheckBoxColumn
和(基于行中的其他数据)我希望选择“隐藏”某些行中的复选框。我知道如何让它只读,但我宁愿它完全不显示或至少显示不同(灰显)比其他复选框。这可能吗?
答案 0 :(得分:12)
一些解决方法:将其设为只读并将颜色更改为灰色。 对于一个特定的细胞:
dataGridView1.Rows[2].Cells[1].Style.BackColor = Color.LightGray;
dataGridView1.Rows[2].Cells[1].ReadOnly = true;
或者,更好但更“复杂”的解决方案:
假设您有2列:第一列是数字,第二列是复选框,当数字>时不应该显示2.您可以处理CellPainting
事件,仅绘制边框(例如背景)并打破休息画。为DataGridView添加事件CellPainting
(可选择测试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);
}
}
答案 1 :(得分:0)
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcheckboxcell.aspx
DataGridViewCheckBoxCell.Visible = false;
编辑:哦,等等,这是只读的。 DERP。
在这种情况下,请尝试使用空的DataGridViewTextBoxCell替换单元格。
答案 2 :(得分:0)
从Customize the Appearance of Cells in the Windows Forms DataGridView Control获取,您可以捕获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
。