Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测多个文本框相对于DataTable初始数据的变化_C#_.net_Winforms_Data Binding_Textbox - Fatal编程技术网

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列进行比较等等…我编辑我的问题以明确我想要什么