DataGridView基于隐藏列的行格式

时间:2016-06-21 12:14:14

标签: winforms datagridview

有没有办法根据用户看不到的列中的某些值来设置行的样式?网格包含几行,如果删除它们,我希望某些行以红色着色。我有一个隐藏列,如果列被删除则存储true,否则为false。我已尝试CellFormatting,但由于我的列不可见,e.ColumnIndex永远不会为我的隐藏列提供正确的值。

非常感谢任何帮助。

修改

下面是我想要完成的图片。您可以看到第二行的文本为红色,这是由于用户在数据网格中无法看到的列中的值。当用户第一次看到表格时(加载时),该网格应该是这样的。

enter image description here

2 个答案:

答案 0 :(得分:0)

根据我的理解,当列是DataGridView中的不可见列时,您希望获得列的值。

是不是?如果我错了,请纠正我。

private void button1_Click(object sender, EventArgs e)  
{  
    dataGridView1.DataSource = CreateDataTable();  
    dataGridView1.Columns["ID"].Visible = false;  // Set the ID column invisible.  
    MessageBox.Show(dataGridView1.Rows[2].Cells["ID"].Value.ToString()); // Get the ID column value.
}  

答案 1 :(得分:0)

而不是CellFormatting,请尝试CellValueChanged表示未绑定数据,或DataBindingComplete表示绑定数据集。例如,让我们说你是"删除/取消删除"使用以下Button.Click事件的行:

private void Button1_Click(object sender, EventArgs e)
{
    bool value = (bool)dataGridView1.CurrentRow.Cells["Deleted"].Value;
    dataGridView1.CurrentRow.Cells["Deleted"].Value = !value;

    // For bound data (like a DataTable) add the following line:
    // ((DataTable)dataGridView1.DataSource).AcceptChanges();
}

未绑定数据

更改行"已删除"以这种方式的列值将触发以下事件处理程序。因此,您可以根据该列的TrueFalse值来为您的行着色:

private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == dataGridView1.Columns["Deleted"].Index)
    {
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value ? Color.Red : Color.Black;
    }
}

绑定数据

对于绑定数据,例如来自DataTable的绑定数据,处理DataBindingComplete事件就足够了。首次设置绑定时以及更改后将触发此事件 - 例如Button1.Click事件的更改。在这里,您将遍历行并根据隐藏列的值设置所需的样式。 (请注意Button1_Click事件处理程序对具有DataTable源的网格的额外更改。这需要立即更改样式 - 否则在您导航之前不会发生到另一行。)

private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.DefaultSCellStyle.ForeColor = (bool)row.Cells["Deleted"].Value ? Color.Red : Color.Black;
    }
}