簡體   English   中英

C# DataGridViewRow - 是新行或更新行

[英]C# DataGridViewRow - is new or updated row

我有 DataGridView,我在其中顯示從數據庫讀取的數據:

DataSet ds = new DataSet();
sqlDa.Fill(ds);
dgView.DataSource = ds.Tables[0]

在 UI 中添加所有行后,我需要 SQL 更新以前從數據庫中讀取的行,並通過單擊保存按鈕對新行進行插入(添加時我不會一一保存行,只是所有當我單擊“保存”按鈕時它們):

foreach (DataGridViewRow dgvRow in dgView.Rows)
{
  // do insert for new rows, and update for existing ones from database
}

我如何知道哪些行是新添加的,哪些不是? 我可以為從數據庫讀取的每一行添加某種類型的屬性,以便我知道它們需要更新嗎?

我如何知道哪些行是新添加的,哪些不是?

你不需要; DGV 顯示的數據表已經在跟蹤這一點。 如果您制作 SqlDataAdapter 並將SqlCommandBuilder 插入其中,請參閱文檔中的示例代碼,以便它在其 InsertCommand/UpdateCommand/DeleteCommand 屬性中獲得查詢(或者您可以將這些命令放入自己,但考慮到這一點並沒有多大意義命令生成器可以自動生成它們)然后您只需說:

theDataAdapter.Update(theDataTable);

如果您沒有將其保存在其他任何地方,您可以從 DGV 的 DataSource 中獲取它:

theDataAdapter.Update(dgView.DataSource as DataTable);

順便說一句,這里的“更新”一詞與更新查詢無關; Microsoft 應該將其稱為 SaveChanges。 它運行各種修改查詢 (I/U/D) 而不僅僅是 UPDATE


如果您真的想知道,並且迫切希望重新發明這個輪子,您可以檢查 DataRow 的 RowState 屬性,它會告訴您它是否已添加、修改或刪除,以便您可以觸發適當的查詢(但實際上您會重新實現 SqlDataAdapter 已經內置的功能)


綜上所述,您可能沒有意識到您可以通過以下方式大大簡化您的生活:

  • 將新的 DataSet 類型的文件添加到您的項目中(就像您添加一個類一樣)。 打開它
  • 右鍵單擊它的表面,選擇添加 TableAdapter
  • (一次)設計您的連接字符串
  • 將查詢輸入為“產生行的選擇”,例如SELECT * FROM SomeTable WHERE ID = Id (建議使用在 ID 上選擇的 where 子句;您可以稍后添加更多查詢以執行其他操作,例如SELECT * FROM SomeTable WHERE SomeColumn LIKE @someValue但現在選擇 ID 為您提供了一個基本查詢,可以方便地加載相關數據)。 如果需要,您還可以使用現有的或新的存儲過程
  • 給它一個合理的名稱對,例如 FillById、GetDataById - FillBy 填充現有表,Get 獲取新表
  • 結束

現在,您的代碼中將有可用的對象,這些對象是包裝器數據適配器和數據表 - 功能相同,但強類型更好

例如,您可以使用以下內容填充您的網格:

var ta = new SomeTableAdapter();
dgView.DataSource = ta.GetDataByFirstName("John%"); //does select * from table where firstname like 'john%' into a datatable

數據表是強類型的,所以你不能像這樣訪問它們:

//no
foreach(DataRow row in someTable.Rows){
  if((row["someColumn"] as string) == "hello" && row.IsNull("otherColumn"))
    row["otherColumn"] = "goodbye";
}

您已命名屬性:

//yes
foreach(var row in someTable){
  if((row.SomeColumn == "hello" && row.IsOtherColumnNull())
    row.OtherColumn = "goodbye";
}

好多了。 LINQ 也適用於它們,沒有 AsEnumerable 或 Cast 並且無休止地投射值..

這不是魔術。 VS 在幕后為您編寫大量代碼 - 檢查 YourDataSet.Designer.cs 文件 - 數百個完全參數化的 SqlCommand,用於所有表操作(選擇/插入/更新/刪除),所有基礎都不需要輸入 SELECT 命令進入工具窗格。 真的很好用,即使這么多年過去了..

哦,但是設計師在 net core 中工作得不是很好。他們在修復 netcore 帶來的錯誤方面確實落后(其他優先事項)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM