【问题标题】:Unselect all rows in datagridview取消选择datagridview中的所有行
【发布时间】:2011-09-06 21:08:21
【问题描述】:

我有两个datagridviews,当我点击其中一个时,我想取消选择第二个datagridview中的所有选择,我尝试了这个,但没有任何效果:

firstItemsDataGridView.ClearSelection();
firstItemsDataGridView.CurrentCell = null;

不工作,

firstItemsDataGridView.ClearSelection();
if (firstItemsDataGridView.Rows.Count > 0)
    firstItemsDataGridView[1, 0].Selected = true;
firstItemsDataGridView.CurrentCell = null;
firstItemsDataGridView.ClearSelection();
foreach (DataGridViewRow item in firstItemsDataGridView.Rows) {
    item.Selected = false;

    foreach (DataGridViewCell itemCell in firstItemsDataGridView.Columns) {
        itemCell.Selected = false;
    }
}

不工作,

firstItemsDataGridView.Rows[0,-1].Selected = true;

也不行。

我已将选择模式设置为全行选择,但我不知道如何实现我的目标。
非常感谢!

【问题讨论】:

  • firstItemsDataGridView 想要的网格吗?您是否再次分配数据源?
  • firstItemsDataGridView 是网格,我需要取消选择所有项目,我没有使用任何数据源(绑定)
  • 设置CurrentCell=null 应该可以解决问题,但是网格中显示的数据是如何提供/添加的?

标签: c# winforms datagridview selection rows


【解决方案1】:
dataGridView1.ClearSelection();

应该可以。也许您有自动选择触发的行的代码?

【讨论】:

  • 别太早了!
【解决方案2】:

由于没有答案,我在其他帖子中使用了这个答案,我遇到了第一行被选中并且无法取消选择的相同问题:

Color blue  = ColorTranslator.FromHtml("#CCFFFF");
Color red = ColorTranslator.FromHtml("#FFCCFF");
Color letters = Color.Black;

foreach (DataGridViewRow r in datagridIncome.Rows)
{
    if (r.Cells[5].Value.ToString().Contains("1")) { 
        r.DefaultCellStyle.BackColor = blue;
        r.DefaultCellStyle.SelectionBackColor = blue;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
    else { 
        r.DefaultCellStyle.BackColor = red;
        r.DefaultCellStyle.SelectionBackColor = red;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
}

这是一个小技巧,您可以看到一行被选中的唯一方法是通过第一列(不是 column[0],而是因此)。当您单击另一行时,您将不会再看到蓝色的选择,只有箭头指示选择了哪一行。

解决方案:

我发现了为什么我的第一行被默认选中,并发现了如何默认不选中它。

默认情况下,我的 datagridview 是我的 windows 窗体上第一个制表位的对象。首先在另一个对象上制作制表位(可能完全禁用数据网格的制表位)禁用选择第一行

【讨论】:

  • dataGridView1.ClearSelection();
【解决方案3】:

NullSkull 的答案为我解决了这个问题,即 datagridview 控件的第 0 行第 0 列的单元格始终在表单加载时被选中,尽管在表单的构造函数方法中调用了 ClearSelection,但无法取消选择。我只需要在 Form_Load 事件中调用 ClearSelection。 http://www.nullskull.com/q/10066166/how-to-deselect-the-first-row-when-the-form-i-loaded-in-datagridview-in-windows-application.aspx

【讨论】:

    【解决方案4】:

    只需使用:

    dgvName.ClearSelection();

    【讨论】:

      【解决方案5】:

      确保所有行都被取消选择(dataGridView.Rows[...].Selected = false)

      行零默认为选中,因此在打开 DataGridView 时设置 dataGridView.Rows[0].Selected = false 并且只要设置了其他选项以使用户无法选择,那么您将拥有并维护,未选择任何内容。

      【讨论】:

        【解决方案6】:
        // no selection in dgv at the begening   
        dgv.FirstDisplayedCell = null;
        dgv.ClearSelection();
        // try this it is working !
        

        【讨论】:

          【解决方案7】:

          如果您使用 WPF 并希望维护 MVVM 设计模式,您可以将两个选定项绑定到同一个属性,这样当您选择一个时,另一个将自动被取消选择。

          试试这样的

          public class SingletonClass
          {
              private static SingletonClass _Instance;
              public static SingletonClass Instance
              {
                  get
                  {
                      if (_Instance == null)
                          _Instance = new SingletonClass();
                      return _Instance;
                  }
              }   // End Property Instance
          
              private object _SelectedItem;
              public object SelectedItem
              {
                  get { return _SelectedItem; }
                  set { _SelectedItem = value; }
              } // End Selected Item
           }
          
          <DataGrid Name="Datagrid1" SelectedItem="{Binding Source={x:Static Const:SingletonClass.Instance},Path=SelectedItem,IsAsync=True}">
          
          <DataGrid Name="Datagrid2" SelectedItem="{Binding Source={x:Static Const:SingletonClass.Instance},Path=SelectedItem,IsAsync=True}">
          

          *我只使用了一个单例类,因为这将在不同的实例中跨不同的视图工作,如果你在同一个视图中,你可以使用一个常规的类。

          请注意 xmal 上的 IsAsync=True,如果您计划在不同视图中使用单例类,没有它就无法工作。

          【讨论】:

            【解决方案8】:

            正如@Taw 在 subcmets 中对最佳答案所说 - “不要太早!”

            在我的情况下,默认行为根本不起作用。我的案例 - tabControl 选项卡中的数据网格,如果之前未显示该选项卡,它就不起作用!

            这个技巧就像一个魅力:

            AnyTabControl.SelectedTab = FirsTab;
            gridModules.ClearSelection(); //placed at first tab
            AnyTabControl.SelectedTab = SecondTab; //that tab i would like to show first
            

            结果:显示给用户的第二个选项卡,当他点击第一个选项卡时,将不会出现。

            【讨论】:

              【解决方案9】:

              我试过了,它对我有用:

              for (int i = 0; i < dataGridView1.Rows.Count;i++)
              {
                dataGridView1.Rows[i].Selected = false;
              }
              

              【讨论】:

                猜你喜欢
                • 2023-04-01
                • 2011-05-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-28
                • 1970-01-01
                • 2015-10-09
                相关资源
                最近更新 更多