簡體   English   中英

C#DataGridView添加一行 - 驗證時,如何知道該行是新的還是尚未提交?

[英]C# DataGridView Adding a Row - When validating, how do I know the row is new and not yet committed?

我有一個客戶端在Windows應用程序中遇到DataGridView問題。 他們正在調用CellValidated事件,但是如果它已經提交回數據源,那么他們希望對單元格進行不同的驗證,而不是首先添加(並且尚未提交)的行(用戶)還沒有離開行。)我嘗試了IsNewRow屬性,但是一旦你開始輸入行,就會添加另一個“新行”,所以你正在使用的行不再被認為是新行。知道該行尚未提交,因為您可以點擊Esc取消編輯,整行消失。

有沒有辦法判斷當前編輯的行是否實際上是“新行”,因為它尚未提交回數據源?

我在過去實現類似的一種方法是利用綁定到列表的對象的id屬性。

例如,如果我有一個BindingList<User> ,其中user就像:

public class Names
{
    public string Name { get; set; }         
    public int id { get; set; }
}

然后,我可以像這樣綁定我的列表:

dataGridView1.AutoGenerateColumns = false;
_users = new BindingList<User>();
_users .Add(new Names() { Name = "joe", id=1 });
_users .Add(new Names() { Name = "pete", id = 2 });

bindingSource1.DataSource = _names;

DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
col1.DataPropertyName = "Name";        

dataGridView1.Columns.Add(col1);

dataGridView1.DataSource = _users;

然后,當DataGridView提供新行時,它的id為0(整數的默認值)。

來自數據庫的每個對象都具有非零ID。

也許有一種方法可以使用BindingSources實現這一點,但我快速查看了那里的屬性,沒有任何東西跳出來。

這種情況下的數據源是什么?

如果它是一個數據表,那么您可以輕松地測試數據表行的DataRowState屬性,以查看它們是新的還是現有的。 一旦驗證了數據行,就可以調用表上的Accept來提交這些行。 在這種情況下,不需要在網格和數據之間進行干擾。

當然,這並不意味着您的數據實際上已提交給數據庫,如果它最終存儲在數據庫中。 那將是另一個步驟。

另外,我通常避免直接寫入datagridview; 相反,我將它設為只讀並彈出一個添加/輸入屏幕,可以執行任何所需的驗證。

我不知道這對你有用嗎 - 如果我錯過了這一點,請告訴我。

這應該可以幫助那些不使用DataTable對象的人:

在CellBeginEdit事件中,將Tag屬性設置為某個值,您將使用該值來區分“新”行

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    if (e.RowIndex == dataGridView1.NewRowIndex)
        dataGridView1.Rows[e.RowIndex].Tag = true;
}

然后在驗證事件中,您可以檢查該值:

if (dataGridView1.Rows[e.RowIndex].Tag is bool 
    && (bool) dataGridView1.Rows[e.RowIndex].Tag)
{
    // new row code

    // after it's added, mark it as 'not new'
    dataGridView1.Rows[e.RowIndex].Tag = false;
}
else
{
    // existing row code
}

GenericMeatUnit的答案對我來說不起作用,但它為我提供了足夠的方法來找到一種方法來使它工作。 這是我現在正在檢查的方式:

if (this.DATASET.DATATABLE.Rows.Count == e.RowIndex)

這個if語句的作用是因為在DataGridView中保留行之前,它實際上並不存在於數據表中,因此數據表中的行數將等於新行的RowIndex,因為RowIndex是從零開始的。

暫無
暫無

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

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