2012-09-19 18 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);

相關問題