C# 检测多个文本框相对于DataTable初始数据的变化
我有一个带有多个C# 检测多个文本框相对于DataTable初始数据的变化,c#,.net,winforms,data-binding,textbox,C#,.net,Winforms,Data Binding,Textbox,我有一个带有多个TextBox控件的表单,我想检查表单打开后是否有任何值被更改 我使用一些TextBox控件显示DataTable的一条记录,并且由于有多个字段,因此我的表单上有多个TextBox控件。我使用数据绑定。我想突出显示TextBox控件的值是否与加载时行的原始值不同 这是我试过的。我使用了一个DataTable并用数据库中存储过程中表示为单行和5列的数据填充它。在TextBox中的Validated事件中,代码比较DataTable中合适的列与编辑文本之间的值。如果它更改了文本框。B
TextBox
控件的表单,我想检查表单打开后是否有任何值被更改
我使用一些TextBox
控件显示DataTable
的一条记录,并且由于有多个字段,因此我的表单上有多个TextBox
控件。我使用数据绑定。我想突出显示TextBox
控件的值是否与加载时行的原始值不同
这是我试过的。我使用了一个DataTable
并用数据库中存储过程中表示为单行和5列的数据填充它。在TextBox
中的Validated
事件中,代码比较DataTable
中合适的列与编辑文本之间的值。如果它更改了文本框。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
,所以我想要一种方法,通过DataTable
中的列来比较每个TextBox
,而无需逐个重复每个控件的代码。例如,如果将txtName
(TextBox
)的文本与DataTable
中的第一列进行比较,称之为fullName
,将文本框txtnockname
与第二列进行比较。。。。。etc并给出结果(将任何更改的TextBox.BackColor
变为黄色)。只需通过键入sender对象从所有已验证事件中获取TextBox实例,并将该TextBox作为参数传递给公共函数,如下所示
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;
}
}
}
只需通过类型转换sender对象从所有已验证事件中获取TextBox实例,并将该TextBox作为参数传递给公共函数,如下所示
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;
}
}
}
使用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);
}
foreach(数据行中的数据行)
{
控件.OfType().ToList().ForEach(c=>c.BackColor=Color.White);
控件.OfType()。其中(c=>c.Text.Trim()!=行[“全名”].ToString())
.ToList().ForEach(c=>c.BackColor=Color.Yellow);
}
或者如果文本框的名称和列的名称相同,则使用行[c.Name]
代替行[“fullName”]
。
或者,如果它们不相同,您也可以使用列的索引,如行[0]
,而不是行[“全名”]
,如果要与列1或行[1]
进行比较,如果要与列2进行比较,依此类推。使用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);
}
foreach(数据行中的数据行)
{
控件.OfType().ToList().ForEach(c=>c.BackColor=Color.White);
控件.OfType()。其中(c=>c.Text.Trim()!=行[“全名”].ToString())
.ToList().ForEach(c=>c.BackColor=Color.Yellow);
}
或者如果文本框的名称和列的名称相同,则使用行[c.Name]
代替行[“fullName”]
。
或者,如果它们不相同,您也可以使用列的索引,如行[0]
,而不是行[“全名”]
,如果您想与列1或行[1]
进行比较,如果您想与列2进行比较,依此类推。如果我正确理解您的问题,您正在将多个文本框绑定到DataTable
中的单个DataRow
对象
可以查询DataRow中的每个项以获取其原始值,如下所示:
var origval=row.Item[columnIndex,DataRowVersion.Current]
,直到调用AcceptChanges
或EndEdit
,此时建议的值变为当前值
因此,您的DETECT\u CHANGE
方法应该比较DataRowVersion.Current
和DataRowVersion.Proposed
希望这有帮助
编辑:MSDN链接:如果我正确理解您的问题,您正在将多个文本框绑定到数据表中的单个数据行
对象
可以查询DataRow中的每个项以获取其原始值,如下所示:
var origval=row.Item[columnIndex,DataRowVersion.Current]
,直到调用AcceptChanges
或EndEdit
,此时建议的值变为当前值
因此,您的DETECT\u CHANGE
方法应该比较DataRowVersion.Current
和DataRowVersion.Proposed
希望这有帮助
编辑:MSDN链接:sooo抱歉。。我犯了一个错误。。。datatable有多个列。。所以我想通过datatable中的列来比较每个文本框。。。再次抱歉,您可以访问附加到当前文本框行的datatable行。。它绑定到datatable,并根据公共handler中的值执行逻辑。使用2方法没有意义。只需保持一个私有void Validated(objectsender,EventArgs e)
方法,并使用此处理程序处理所有已验证的事件<代码>发件人
指向引发事件的文本框
。sooo抱歉。。我犯了一个错误。。。datatable有多个列。。所以我想通过datatable中的列来比较每个文本框。。。再次抱歉,您可以访问附加到当前文本框行的datatable行。。它绑定到datatable,并根据公共handler中的值执行逻辑。使用2方法没有意义。只需保持一个私有void Validated(objectsender,EventArgs e)
方法,并使用此处理程序处理所有已验证的事件Sender
指向引发事件的TextBox
。TextBox的名称和列的名称不一样。@a_fathy那么您想将它与TextBox.Text
进行比较的列的名称是什么?@a_fathy您也可以像这样使用列的索引行[0]
如果要与第1列进行比较,行[1]
如果要与第2列进行比较等等…我编辑我的问题以明确我想要什么