【问题标题】:Check if textbox text was changed since form was opened检查自表单打开后文本框文本是否已更改
【发布时间】:2011-02-26 19:06:03
【问题描述】:

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

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

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

我该怎么做?

编辑:我只是想到了这一点。也许我可以在表单加载时将所有值放入类字符串中,然后在运行查询之前对其进行检查。有时你只需要把问题变成文字就能想到答案:D

无论如何,这是我能想到的最好的......

【问题讨论】:

  • 我可能会设置一个类来保存对文本框的引用,并在创建它时存储它的值,然后有一个“HasChanged”属性将当前文本与存储的值进行比较。更一般地说,您可以让它存储一个 lambda 表达式来检索值,因此它可以与所有控件一起使用。

标签: c# textbox


【解决方案1】:

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

【讨论】:

  • 使用了标签。其他想法?
【解决方案2】:

你可以试试这样的。

 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
        }
    }

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你可以做一个字段

      bool test = false;
      

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

      那个事件设置 test = true;

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          这是基于我的评论的快速解决方案,在 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);
          

          【讨论】:

            【解决方案7】:

            你可以使用:

            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);
            }
            

            【讨论】:

              【解决方案8】:
              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
              

              【讨论】:

                【解决方案9】:

                看看:

                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。当您回答问题时,请同时提供解释,以便人们(不仅仅是提问者)可以向您学习。您可以返回并编辑此答案以使其更清晰
                猜你喜欢
                • 2014-11-27
                • 2014-11-17
                • 1970-01-01
                • 1970-01-01
                • 2017-03-10
                • 1970-01-01
                • 2022-07-28
                • 1970-01-01
                相关资源
                最近更新 更多