【问题标题】:DataGridView not being repaintedDataGridView 没有被重绘
【发布时间】:2013-02-27 15:51:42
【问题描述】:

我有一个DataGridView,我使用row.Visible 选择性地(迭代地)隐藏行:

void UpdateMessageWindow()
{
    MessageDataGridView.CurrentCell = null;
    foreach (DataGridViewRow row in MessageDataGridView.Rows)
    {
        row.Visible = DisplayedLevels.HasFlag((MessageLevel)row.Cells[3].Value);
    }
}

我遇到了一个问题,即在添加行后,它们不会被重新绘制,直到您单击单元格(以重新绘制单击的单元格)、按下某个键或隐藏窗口。如果将鼠标移到 DGV 上,您可以看到它们存在,随着光标的变化。

我很确定我已经在 DataGridView 上尝试了所有相关探测方法的组合,但没有任何帮助。

编辑: 我已经修改它以使用 BindingSource.Filter,向 DataSet 表添加“可见”列,设置 messageBindingSource.Filter = "Visible",并将 UpdateOutput 重写为

void UpdateOutputWindow() 
{
    foreach (JobDataSet.MessagesRow row in _dataSet.Messages)
    {
        row.Visible = DisplayedLevels.HasFlag(row.Level);
    }
}

但它仍然显示相同的行为。

【问题讨论】:

  • 不能应用行过滤器吗?而不是迭代每一行?或者过滤数据源?
  • 数据源是DataSet,不支持过滤,BindingSource.Filter等不支持位运算符。
  • 不能将 DataView 与 DataSet 一起使用吗?
  • @Derek 要么我遗漏了某些东西,要么具有相同的限制,但请参阅编辑,使用 messageBindingSource.Filter 不会改变行为。

标签: c# winforms datagridview


【解决方案1】:

尝试使用以下方法聚焦 DataGridView:

MessageDataGridView.Focus();

【讨论】:

  • 不:/。我可能应该补充一点,您需要单击 DGV 的每个单元格才能重新绘制它们。
  • 您的 DataGridView 是否绑定到数据源?
  • 是的,绑定到 BindingSource,而后者又绑定到 DataSet。我会使用BindingSource.Filter,但它不支持位运算符。
  • 我会事先过滤您的结果,以便数据源仅包含您希望显示的记录。
【解决方案2】:

我发现答案是为DataTable.RowChanged 事件添加一个处理程序:

_dataSet.Messages.RowChanged += delegate
                                {
                                    MessageDataGridView.Invalidate();
                                    MessageDataGridView.Update();
                                };

这可能效率低下,但确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多