检查自打开表单后文本框文本是否已更改

时间:2011-02-26 19:06:03

标签: c# textbox

你好
我的应用程序中有一个表单,有7个文本框。在窗体的构造函数中,我运行方法“MakeText()”,将MySqlDataReader中的值插入到文本框中。

用户可以更改这些文本框中的值,当单击“提交”按钮时,它将在数据库上运行更新查询以写入所做的所有更改。
这一切都很好,但即使用户没有更改文本框中的任何文本,我发现查询数据库也浪费资源。

所以我需要一些方法来检查用户是否在表单加载后更改了文本框中的任何值。
我想在应用程序级别执行此操作,而不是让数据库处理它。

我该怎么做?

编辑:我只想到了这一点。也许我可以在表单加载时将所有值放入类字符串中,然后在运行查询之前检查它。有时你只需要在文字中加入一个问题来思考答案:D

这是我能想到的最好的......

9 个答案:

答案 0 :(得分:6)

您可以将初始值存储在文本框的.tag值中,然后在当前文本和标记文本之间进行比较

答案 1 :(得分: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 :(得分:2)

你可以有一个与你的每个文本框相关的布尔标志,并在该事件被触发时使用文本框的textchanged事件,这意味着发件人文本框中的文本已经改变,所以你必须设置标志来显示此文本框的文本已更改。 *如果你想要yoiu可以使用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
    }

答案 3 :(得分:1)

你可以创建一个字段

bool test = false;

然后检查每个TextBox的TextChaged事件..

该事件设置test = true;

然后按下提交,检查test = true,如果是,则更新数据库

答案 4 :(得分:1)

为每个文本框创建一个包含属性的类。在该类中,实现确定是否进行了更改所需的逻辑。

然后使用数据绑定将文本框附加到类的实例。

答案 5 :(得分: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);

答案 6 :(得分: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);
}

答案 7 :(得分:-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

答案 8 :(得分:-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