2017-10-15 69 views
2

DataGridView必須滿足什麼條件才能由用戶編輯GUI?如按F2進行修改,選擇要刪除的行或添加新行?C#GUI可編輯DataGridView

當我將DataGridView.DataSource綁定到本地集合對象(如List<T>)時,我可以執行所有這三項操作。

當我將DataGridView.DataSource綁定到DataTableDataView時,我也可以用圖形方式完成所有這三個操作。

但是,當我結合DataGridView.DataSourceDbSet<T>.ToList<T>()DbSet<T>.ToArray<T>()Entity Framework),I只能修改現有的行的非主鍵值,儘管我已經啓用刪除通過DataGridView的嚮導中添加功能,和專門設置AllowUserToAddRowsAllowUserToDeleteRowstrue。運行時,應用程序不會顯示星號符號,表示可添加新行。刪除行也是不可能的。

但是,數據顯示正確。

所以,我很困惑。上述數據源的哪些特徵可能會導致GUI中的不同行爲?

由於

回答

2

DataGridView控制允許用戶如果兩個AllowUserToAddRow被設置爲真和底層數據源實現IBindingList返回AllowNew作爲真正添加行。類似的刪除規則也是如此。

你可以看看AllowUserToAddRowsInternalAllowUserToDeleteRowsInternal內部方法的源代碼。

  • List<T>

    基於數據源作爲一個結論,這些都是允許的操作編輯

  • BindingList<T>:添加,編輯,刪除(對於添加,T應該有參數的構造函數)
  • Array :編輯
  • DataTable:添加,編輯,刪除
  • BindingSource:取決於und erlying數據源的BindingSource。如果它是IBindingList的實現,則從它那裏請求,否則如果列表不是FixedSize那麼允許所有操作,否則只允許編輯。例如,如果您將List<T>設置爲綁定源的數據源,然後將綁定源設置爲數據網格視圖的數據源,則該列表將被允許用於所有操作。
  • IBindingList:從實施中詢問。
+0

謝謝。對於列表這個根本不是IBindingList實現的數據源,是否意味着AllowUserToAddRows或AllowUserToDeleteRows屬性足以確定是否允許添加或刪除行?列表似乎支持添加除了您的結論中的編輯和刪除。謝謝 –

+0

編輯'DataGridView'中'List '的唯一方法是使用'BindingSource'。根據綁定源規則,如果您將'List '設置爲'BindingSource'的數據源,然後將'BindingSource'設置爲'DataGridView'的數據源,那麼您可以*添加*,*編輯*和*刪除*清單'的項目。 –

+1

除了上述支持* Add *的條件之外,別忘了使用公共無參數的構造函數(通常在普通類中有這個)。 –

0
  1. 填充DataTable,並用它作爲一個比南源的DataGridView

1.1不要在datagridview的變化...

public void DAL_UpdateStudentsTable(DataTable table) //DAL represents 3-tyer architecture (so data access layer) 
{ 
    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    { 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.CommandText = @"UPDATE Students SET " + 
       "StudentID = @id, " + 
       "FirstName = @first, " + 
       "LastName = @last, " + 
       "Birthday = @birthday, " + 
       "PersonalNo = @personal " + 
       "WHERE StudentID = @oldId"; 
     cmd.Parameters.Add("@id", SqlDbType.Int, 5, "StudentID"); 
     cmd.Parameters.Add("@first", SqlDbType.VarChar, 50, "FirstName"); 
     cmd.Parameters.Add("@last", SqlDbType.VarChar, 50, "LastName"); 
     cmd.Parameters.Add("@birthday", SqlDbType.DateTime, 1, "Birthday"); 
     cmd.Parameters.Add("@personal", SqlDbType.VarChar, 50, "PersonalNo"); 
     SqlParameter param = cmd.Parameters.Add("@oldId", SqlDbType.Int, 5, "StudentID"); 
     param.SourceVersion = DataRowVersion.Original; 
     cmd.Connection = sqlConn; 
     using (SqlDataAdapter da = new SqlDataAdapter()) 
     { 
     da.UpdateCommand = cmd; 
     da.Update(table); 
     } 
    } 
    } 
} 
  • 當你想更新數據庫只需創建一個更新命令,並像上面所看到的那樣執行它。