2012-09-19 16 views
6

我已经在使用datagridview的Visual Studio(C#)中创建了一个应用程序。现在,当我分配DataGridView的DataSource时,它会自动选择第一行,并执行我的代码以供选择。由于我经常重新分配该数据源,所以这不是理想的。有没有办法改变它,所以它不会自动进行第一次选择,而只依赖于用户的选择?如何禁用VS数据视图中的第一个自动选择?

谢谢!

回应Darshan Joshi的评论: 除了自动生成的代码之外,在datagridview上更改的唯一东西是将AutoGenerateColumns设置为false,并设置DataSource属性。 我在我的choosechanged委托中放置了一个MessageBox.Show,它似乎甚至在每次设置数据源时都调用三次。一次在数据加载之前,两次之后。

由于数据源是在某些用户操作后设置的,而不是在初始化时设置的,所以我无法在加载时将其设置为false。

+0

它了奇怪的行为,它不能自动选择的值,可以显示你的代码,它可能有助于把握错误是什么。 – 2012-09-19 12:39:55

回答

1

我有同样的问题,这里是我的解决方案。

棘手的部分是找到清除选择的位置......我们只能在DataGridView设置选择后清除选择。首先,选择只能在Form.Load事件中清除,但DataGridView.DataSource的子设置可以在DataSource赋值后立即清除。

public class DataGridView_AutoSelectSuppressed : DataGridView 
{ 
    private bool SuppressAutoSelection { get; set; } 

    public DataGridView_AutoSelectSuppressed() : base() 
    { 
     SuppressAutoSelection = true; 
    } 

    public new /*shadowing*/ object DataSource 
    { 
     get 
     { 
      return base.DataSource; 
     } 
     set 
     { 
      SuppressAutoSelection = true; 
      Form parent = this.FindForm(); 

      // Either the selection gets cleared on form load.... 
      parent.Load -= parent_Load; 
      parent.Load += parent_Load; 

      base.DataSource = value; 

      // ...or it gets cleared straight after the DataSource is set 
      ClearSelectionAndResetSuppression(); 
     } 
    } 

    protected override void OnSelectionChanged(EventArgs e) 
    { 
     if (SuppressAutoSelection) 
      return; 

     base.OnSelectionChanged(e); 
    } 

    private void ClearSelectionAndResetSuppression() 
    { 
     if (this.SelectedRows.Count > 0 || this.SelectedCells.Count > 0) 
     { 
      this.ClearSelection(); 
      SuppressAutoSelection = false; 
     } 
    } 

    private void parent_Load(object sender, EventArgs e) 
    { 
     ClearSelectionAndResetSuppression(); 
    } 
} 

希望这会有所帮助。

+1

赫赫是完全诚实的我的朋友我现在已经放弃了我的工作,所以理论上它并没有帮助:P但仍然非常有趣,谢谢。非常奇怪的是,看似简单的东西需要一个如此笨拙的解决方案。我不喜欢使用C#进行编码的原因之一 - 太多无法直接控制的幕后幕后。尽管如此,谢谢你的回应,也许这会在未来帮助其他不幸的灵魂! – Zeno

+0

@皮诺哈哈!!真棒,有一个很好的队友。解决DataGridViews之类不需要的行为的方法似乎花费了太多的精力,我总是希望得到更优雅的解决方案。有时候感觉就像我在使用希思罗宾逊机器一样,但是以他们期望使用的方式使用,表现非常出色。 – PunkUnicorn

+0

我试过你的解决方案,但它似乎并没有真正的工作。 – leetNightshade

0

你可以取消它在你的Form_Load事件 像

private void Form1_Load(object sender, EventArgs e) 
     { 
       dataGridView1.Rows[0].Selected = false; 
     } 
+0

这可能会修复症状,但它不能解决潜在的问题 – Basic

+1

要解决为什么我没有选择此答案:如果在用户交互而不是表单加载后设置数据源,则不会修复症状。 – Zeno

0

要加载没有任何选择的网格,您可以使用此代码段。

GridView.CurrentCell = null; 

这将载入它明白,没有任何选择。将数据源分配给网格后添加。

5

你应该叫:ClearSelection事件之后:DataBindingComplete

+1

这将是理想的解决方案,但它不会抑制SelectionChanged事件仍然触发'幻像'选择 – PunkUnicorn

-1

只需添加的SelectedItem = “ - 1”,这将这样的伎俩

<DataGrid Name="dataGrid" SelectedItem="-1" /> 
+2

它没有标记,但问题是WinForms问题。 – LarsTech

0

确保您有调用方法加载来自表单构造函数的数据。如果从Form.load()调用它

也myDataGridView后载入做到这一点

myDataGridView.Rows [0] = .Selected假;只是绑定数据,然后重新注册事件之前

注销SelectionChanged事件:

0

这为我工作。 也许你应该删除设计器中的事件注册,并在代码中手动注册事件。

myDGV.SelectionChanged -= new System.EventHandler(this.myDGV_SelectionChanged);

相关问题