【问题标题】:DataGridView row formatting based on hidden column基于隐藏列的DataGridView行格式
【发布时间】:2016-06-21 12:14:13
【问题描述】:

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

任何帮助将不胜感激。

编辑:

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

【问题讨论】:

  • 请发布 MCVE。预期结果的图片也会有所帮助

标签: winforms datagridview


【解决方案1】:

对于未绑定的数据,请尝试 CellValueChanged,而不是 CellFormatting,对于绑定的数据集,请尝试 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 事件的更改。在这里,您将遍历行并根据隐藏列的值设置所需的样式。 (请注意对具有DataTable 源的网格的Button1_Click 事件处理程序的额外更改。这是立即更改样式所必需的 - 否则在您导航到不同的行之前不会发生。)

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;
    }
}

【讨论】:

  • 我一整天都在寻找这个答案:((我发现了很多关于同一问题的不完整答案。谢谢@OhBeWise
  • @ValiMaties 很高兴为您提供帮助!
【解决方案2】:

根据我的理解,当列是 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.
}  

【讨论】:

  • 我需要根据 dataGridView 中不可见的列中的某些值为某些行着色。我可以得到值,但我想使用一些事件来为行着色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2013-08-11
相关资源
最近更新 更多