【问题标题】:If I have multiple datagridviews on one form, how would I allow a row selection to be active on only one at a time?如果我在一个表单上有多个 datagridviews,我将如何允许一次仅在一个表单上激活行选择?
【发布时间】:2021-09-24 19:55:05
【问题描述】:

我有两个数据网格视图,它们同时显示两个单独的存储过程,都在同一个表单上。我将他们的“SelectionMode”属性设置为“FullRowSelect”。

但是,我希望在两个 dgv 之间一次只能选择一行。因此,如果有人在 dgv A 上选择了一行,我希望 dgv B 中的选定行取消突出显示或停用。如果有人选择了 dgv B 中的一行,我希望 dgv A 中突出显示的行取消选择或停用。有没有办法基本上分享一个

private void datagridview1_SelectionChanged(object sender, EventArgs e)

在两个单独的数据网格视图之间? 我不确定从哪里开始,所以我没有代码示例。对此的任何帮助表示赞赏。谢谢!!

【问题讨论】:

  • WPF 表单?你的意思是一个WinForm的表格。为什么SelectionChanged?也许 share 一个 Leave 事件处理程序。 -- 标记您的问题,指定正确的 GUI 平台。

标签: c# .net datagridview


【解决方案1】:

dataGridView1中选择时,调用dataGridView2.ClearSelection()

您提到了一个事件处理程序来处理两者,您可以这样做。并且您可以编写一些代码来查找除您单击的 DataGridView 之外的所有其他 DataGridView,并清除它们的选择。

private void dataGridView_SelectionChanged(object sender, EventArgs e)
{
    var s = (DataGridView)sender;
    if (s.SelectedRows.Count > 0)
    {
        var otherDataGridViews = this.Controls.OfType<DataGridView>().Except(new[] { s });
        foreach (var dgv in otherDataGridViews)
        {
            dgv.ClearSelection();
        }
    }
}

如果 DataGridViews 在同一个容器内,即相同的表单,而不是在不同的面板等中,这将起作用。

您必须在设计器或设计器代码中指定相同的处理程序,即

// 
// dataGridView1
// 
...
this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged);
// 
// dataGridView2
// 
...
this.dataGridView2.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged);

【讨论】:

  • 非常感谢。这似乎可行,除了在相反的 dgv 取消选择中的行和选择新 dgv 中的行之间必须单击一次。所以我在 dgv A 中选择了一行。如果我想在 dvg B 中选择一行,我必须在 B 中单击一次,然后取消选择 A 中的行。然后我必须再次单击以选择 dgv B 中的行.我希望这不会太混乱。除此之外它还有效。关于为什么会发生这种情况的任何线索?
  • @Lguystillfly 我刚刚在处理程序中添加了一个检查,以查看是否选择了任何内容。处理程序被触发两次 - 一次用于取消选择,一次用于选择。它似乎解决了您提到的问题。
  • 它确实修复了它!再次非常感谢。非常感激。更好的是它是有道理的。确实学到了一些东西,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多