2012-03-02 81 views
0

我正在使用winform DataGridView進行數據輸入。問題是,當我的用戶輸入一行但沒有點擊它時,該行不會被保存到網格的數據源(內存中的數據表)。所以,當我的用戶提交表單時,我想檢測DataGridview是否有焦點,並模擬按鍵(tab?)或將焦點設置爲不同的控件,或者執行其他操作來保存當前行而不更改數據。DataGridview.ContainsFocus返回錯誤

DataGridView.ContainsFocus總是返回假的,因爲是DataGridView.Focused。有我應該使用的另一個屬性?我應該如何保存這一行數據?

編輯:見我如何創建DataTable,並將其綁定到DataGridView這個問題Trouble using DataGridViewComboboxColumn for input。並datagridview not allowing user to delete row看到我有這個相同的數據網格的另一個問題。

+0

如果他們實際上是點擊一個提交按鈕,那麼焦點已經離開了網格。這就是爲什麼Grid.Focused是錯誤的。必須有另一個原因,這些更改沒有提交給數據源。 – 2012-03-05 20:52:59

+0

@IgbyLargeman -k,我該找什麼? – MAW74656 2012-03-05 20:53:39

+0

您可以在這裏詳細介紹一下工作流程。你說用戶沒有點擊一行,但保存被觸發。什麼觸發了?我在過去很久以前就碰到過類似的事情,所以細節很模糊。一如往常一些代碼會真的幫助。 – 2012-03-05 21:04:51

回答

3

視窗表單控件可以直接連接到數據源,但被設計成與一個BindingSource控制中使用。這用於從表單控件向數據源輸入和從數據源輸入。

這是你可以拖動到您的窗體設計器中,然後你可以將它設置爲你的DataGridView控件的數據源的組件。

一旦它的形式,你可以使用設計器將其設置爲數據源爲您的datagridview。然後,您可以使用事件處理程序,例如,表單加載事件處理程序來提供數據表作爲綁定源的數據源。

綁定源爲您提供了更精細的控制如何以及何時數據從表單控件轉移到下層數據源。只需使用綁定源即可解決您的問題。如果沒有,那麼在嘗試保存數據之前調用綁定源上的EndEdit方法應該會將未完成的編輯寫入數據表。

舉一個簡單的例子,創建一個新的Windows窗體項目。在表單中,添加一個名爲「datagridview1」的datagridview,一個名爲peopleBinding源的BindingSource和一個名爲saveButton的命令按鈕。將gridview1的數據源設置爲peopleBindingSource。

添加form.Load和saveButton.Click事件處理程序如下:

public DataTable GetData() 
    { 
     DataTable t = new DataTable(); 
     t.Columns.Add("FirstName", typeof(string)); 
     t.Columns.Add("LastName", typeof(string)); 
     t.Rows.Add("Joe","Bloggs"); 
     t.Rows.Add("Fred","Bloggs"); 
     return t; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.AutoGenerateColumns = true; 
     DataTable people = GetData(); 
     peopleBindingSource.DataSource = people; 

    } 

    private void SaveButton_Click(object sender, EventArgs e) 
    { 
     DataTable t = peopleBindingSource.DataSource as DataTable; 
    } 

運行的應用程序,你會發現,如果你檢查的數據表中SaveButton_Click你已經對所做的任何更改數據被保存。

如果你喜歡的Visual Studio編寫所有的代碼,您:

  1. 添加使用「添加數據源......」嚮導創建新的數據源。
  2. 從數據源窗口中,將表格拖到表單上。

Visual Studio將添加必要的DataGridView,BindingSource等並將它們全部連接起來。然後你可以檢查代碼,看看它們如何組合在一起。

+0

- 很好的解釋!但是,儘管我很固執,但我找到了一種不改變設置的方法。我所做的只是使用你的概念,並在提交按鈕處理程序中調用此代碼:'if(gridDowntime.IsCurrentRowDirty) { gridDowntime.BindingContext [downtimeEntries] .EndCurrentEdit(); } ' – MAW74656 2012-03-08 15:28:17