检查文本框内容是否自表单打开以来发生了更改

4
你好
我的应用程序中有一个表单,其中包含7个文本框。在表单的构造函数中,我运行“MakeText()”方法,将MySqlDataReader中的值插入到文本框中。
用户可以更改这些文本框中的值,并且当单击“提交”按钮时,它将在数据库上运行更新查询以写入所有更改。
这一切都很好,但是即使用户没有更改文本框中的任何文本,我发现查询数据库是一种资源浪费。
因此,我需要一种方法来检查用户在加载表单后是否更改了文本框中的任何值。
我希望在应用程序级别上执行此操作,而不是让数据库处理它。
我该如何做呢?
编辑:我突然想到了一个主意。也许我可以在表单加载时将所有值放入类字符串中,然后在运行查询之前仅针对该类进行检查。有时候你只需要把问题说出来才能想到答案:D
那是我想到的最好的方法了...

我可能会设置一个类来保存文本框的引用,并在创建时存储其值,然后有一个“HasChanged”属性来比较当前文本与存储的值。为了更通用,您可以让它存储一个lambda表达式来检索值,这样它将适用于所有控件。 - asawyer
9个回答

9

您可以将初始值存储在文本框的.tag值中,然后只需比较当前文本和标记文本即可。


使用标签。还有其他想法吗? - Bitterblue

5
您可以尝试像这样做。
 public bool TextWasChanged = false;
 protected void form1_load()
 {
     MakeText();
     textBox1.TextChanged += new System.EventHandler(this.textBox_TextChanged);
     textBox2.TextChanged += new System.EventHandler(this.textBox_TextChanged);    
     ...
     ...
     ...

 }

    private void textBox_TextChanged(object sender, EventArgs e)
    {
        TextWasChanged = true;
    }

    void UpdateDB()
    {
        if(TextWasChanged)
        {
              // Update DB
        }
    }

2

对于每个文本框,您可以拥有一个布尔标志,并在文本框的TextChange事件中使用该标志。当该事件被触发时,表示发送方文本框中的文本已更改,因此您必须设置标志以显示该文本框的文本已更改。 *如果您希望,可以使用TextBox.Tag代替上述标志。

private void textBox_TextChanged(object sender, EventArgs e)
    {
        ((TextBox)sender).tag = "true" ; //you can set whatever you want here to show text has changed
    }

1

你可以创建一个字段

bool test = false;

然后检查每个文本框的TextChaged事件..

该事件设置test = true;

然后在提交时,检查test是否为true,如果是,则更新数据库


1
创建一个类,为每个文本框添加一个属性。在该类中实现所需的逻辑以确定是否进行了更改。
然后使用数据绑定将文本框附加到您的类的实例上。

0
这是一个基于我的评论的快速解决方案,在linqpad中设置(可能不需要泛型)。
void Main()
{
    var test = new tester() { val = "123" };
    var changeTest = new ObjectHasChanged<tester>(test,t=>t.val);

    changeTest.HasChanged.Dump(); //false

    test.val = "321";

    changeTest.HasChanged.Dump(); //true
}
public class tester
{
    public string val { get; set; }
}
public class ObjectHasChanged<T>
{
    public bool HasChanged
    {
        get
        {
            return !this.initvalue.Equals(this.valueExpression(this.obj));
        }
    }
    private object initvalue {get; set;}
    private Func<T,object> valueExpression { get; set; }
    private T obj { get; set; }
    public ObjectHasChanged(T obj, Func<T,object> valueExpression)
    {
        this.obj = obj;
        this.valueExpression = valueExpression;
        this.initvalue = valueExpression(this.obj);
    }
}

你可能会说类似这样的话:
var MyTextBoxChangeTest = 
    new ObjectHasChanged<Textbox>(this.myTextBox,t=>t.Text);

0

您可以使用:

private TextWatcher textWatcher;

在 InitializeComponent() 之后的构造函数中:
var textWatcher = TextWatcher.Watch(tbProfile);

填写未修改的文本时:

textWatcher.SetInitialState();

检查控件的文本是否已更改:

textWatcher.IsChanged

实现

using System.Windows.Forms;

public class TextWatcher
{
    private Control control;
    private string initialState;

    public TextWatcher(Control control)
    {
        this.control = control;
    }

    public void SetInitialState() => initialState = control.Text;

    public bool IsChanged => initialState != control.Text;

    public static TextWatcher Watch(Control control) => new TextWatcher(control);
}

-1

看看:

Private Sub cmdTutup_Click()
   If mbEditFlag = True Then
   If MsgBox("Apakah perubahan akan disimpan ", 4 + 32 + 256, "Perhatian") = vbYes Then
     sqltxt = "update tbproduk set kduser='" & vkduser & _
     "',margin1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 4)) & ",margin2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 5)) & ",margin3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 6)) & ",margin4=" & Val(fgproduk.TextMatrix(brsditinggaklan, 7)) & ",margin5=" & Val(fgproduk.TextMatrix(brsditinggaklan, 8)) & _
     ",hrgjual1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 9)) & ",hrgjual2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 10)) & ",hrgjual3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 11)) & ",hrgjual4=" & Val(fgproduk.TextMatrix(brsditinggaklan, 12)) & ",hrgjual5=" & Val(fgproduk.TextMatrix(brsditinggaklan, 13)) & _
     ",discjual=" & Val(fgproduk.TextMatrix(brsditinggaklan, 14)) & ",qty1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 15)) & ",qty2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 16)) & ",qty3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 17)) & _
     " where kdproduk='" & fgproduk.TextMatrix(brsditinggaklan, 1) & "'"
     conn.Execute sqltxt, , adCmdText
   End If
   mbEditFlag = False
  End If
  Unload Me
End Sub

欢迎来到 Stack Overflow。当你回答一个问题时,请提供解释,以便人们(不仅仅是提问者)可以从你那里学习。你可以回来编辑这个答案,使它更清晰。 - Mikkel

-1
Private Sub cmdTutup_Click()

If mbEditFlag = True Then
  If MsgBox("Apakah perubahan akan disimpan ", 4 + 32 + 256, "Perhatian") = vbYes Then
     sqltxt = "update tbproduk set kduser='" & vkduser & _
     "',margin1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 4)) & ",margin2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 5)) & ",margin3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 6)) & ",margin4=" & Val(fgproduk.TextMatrix(brsditinggaklan, 7)) & ",margin5=" & Val(fgproduk.TextMatrix(brsditinggaklan, 8)) & _
     ",hrgjual1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 9)) & ",hrgjual2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 10)) & ",hrgjual3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 11)) & ",hrgjual4=" & Val(fgproduk.TextMatrix(brsditinggaklan, 12)) & ",hrgjual5=" & Val(fgproduk.TextMatrix(brsditinggaklan, 13)) & _
     ",discjual=" & Val(fgproduk.TextMatrix(brsditinggaklan, 14)) & ",qty1=" & Val(fgproduk.TextMatrix(brsditinggaklan, 15)) & ",qty2=" & Val(fgproduk.TextMatrix(brsditinggaklan, 16)) & ",qty3=" & Val(fgproduk.TextMatrix(brsditinggaklan, 17)) & _
     " where kdproduk='" & fgproduk.TextMatrix(brsditinggaklan, 1) & "'"
     conn.Execute sqltxt, , adCmdText
  End If
  mbEditFlag = False
 End If
 Unload Me
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接