2017-09-18 22 views
0

我有一個窗體與多個TextBox控件,我想檢查是否有任何值自打開窗體後進行了更改。檢測多個文本框共同映射到DataTable的初始數據的更改

我展示DataTable的單個記錄使用一些TextBox控制和由於有多個字段,所以也有我的form.I多個TextBox控制正在使用數據綁定。並且我想要突出顯示TextBox控件,如果它們的值與加載時行的原始值不同。

這是我試過的。我使用了一個DataTable,並填充了數據,表示爲數據庫中存儲過程的單行和5列。在TextBox中的Validated事件中,代碼比較DataTable中合適的列與編輯文本之間的值。如果它將TextBox.Backcolor變成黃色。這裏是我的代碼:

private void txtName_Validated(object sender, EventArgs e) 
{ 
    DataTable dt = Person.DETECT_CHANGES(txtName.Text, txtNickName.Text); //could be many columns here 

    foreach (DataRow row in dt.Rows) 
    { 
     if ((txtName.Text).Trim() != row["fullName"].ToString()) 
     { 
      txtName.BackColor = Color.Yellow; 
      break;further 
     } 
     else 
     { 
      txtName.BackColor = Color.White; 
     } 
    } 

它工作正常。但是因爲我有很多TextBoxe,所以我想要一個方法來比較TextBox的每個DataTable的列,而不是每個控件都重複一個一個的代碼。例如,如果文本txtNameTextBox)與DataTable中名爲fullName的第一列相比較,並且文本框txtNickName通過名爲nickname .....等等的第二列進行比較並給出結果(將任何改變的TextBox.BackColor變爲黃色) 。

+1

爲什麼你有一個'foreach'循環,同時要檢查'TextBox'值已經改變?這是一個單一的值,應該與單個值進行比較。 –

+0

那就對了..但我這樣做是因爲我計劃比較許多文本框與許多列..因爲我想在我的問題 –

+0

只是爲了確保您的要求** 1)**您使用一些文本框顯示DataTable的單個記錄? ** 2)**您正在使用數據綁定。 ** 3)**如果文本框的值與加載時行的原始值不同,則需要突出顯示文本框。 –

回答

2

通過類型轉換髮送對象剛剛得到來自所有確認事件的文本框實例,並將該文本作爲參數傳遞給普通的功能如下

private void textBox1_Validated(object sender, EventArgs e) 
{ 
    TextBox t = (TextBox)sender; 
    Common_Validated(t,e); 

} 

private void Common_Validated(TextBox txtName, EventArgs e) 
{ 
    DataTable dt = Person.DETECT_CHANGES(txtName.Text); 

    foreach (DataRow row in dt.Rows) 
    { 
     if ((txtName.Text).Trim() != row["fullName"].ToString()) 
     { 
      txtName.BackColor = Color.Yellow; 
      break; 
     } 
     else 
     { 
      txtName.BackColor = Color.White; 
     } 
    } 
} 
+0

sooo對不起..我犯了一個錯誤...數據表有多個列..所以我想比較每個文本框的數據表中的列。 ..再次對不起 –

+0

你可以訪問數據錶行附加到當前文本行..這是綁定到數據表和執行邏輯基於常見處理器中的值 –

+0

更多的幫助代碼請@sumeet –

1

使用LINQ:

foreach (DataRow row in dt.Rows) 
{ 
    Controls.OfType<TextBox>().ToList().ForEach(c => c.BackColor = Color.White); 
    Controls.OfType<TextBox>().Where(c => c.Text.Trim() != row["fullName"].ToString()) 
       .ToList().ForEach(c=> c.BackColor = Color.Yellow);   
} 

或者使用row[c.Name]而不是row["fullName"]如果TextBox的名稱和列名相同。 或者如果它們不相同,如果您想要與第1列進行比較,或者想要與第2列進行比較等,則可以使用像這樣的列的索引row[0]而不是row["fullName"]

+0

TextBox的名稱和列的名稱是不一樣的。 –

+0

@a_fathy那麼你想將它與'TextBox.Text'進行比較的列名是什麼? –

+0

@a_fathy如果要與列1進行比較,並且如果要與列2進行比較等,則還可以使用像這樣的「行[0]」列的索引... –

0

如果我正確理解您的問題,您將多個文本框綁定到DataTable中的單個DataRow對象。

一個DataRow每個項目可以查詢得到,像這樣原來的值:

var origval = theRow.Item[columnIndex, DataRowVersion.Current];,那就是直到你調用AcceptChangesEndEdit,此時建議值變爲電流。

因此,您的DETECT_CHANGE方法應該比較DataRowVersion.CurrentDataRowVersion.Proposed

希望這會有所幫助。

編輯:MSDN鏈接:DataRowVersion documentation