Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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# 如果所有输入都有效,则隐藏对话框(ObjectDisposedException)_C#_User Interface_Compact Framework_Objectdisposedexception - Fatal编程技术网

C# 如果所有输入都有效,则隐藏对话框(ObjectDisposedException)

C# 如果所有输入都有效,则隐藏对话框(ObjectDisposedException),c#,user-interface,compact-framework,objectdisposedexception,C#,User Interface,Compact Framework,Objectdisposedexception,我正在开发一个C#GUI应用程序,它使用Windows CE 5扫描设备的紧凑框架 该应用程序用于反复收集用户输入的数据,主要是通过条形码扫描仪输入的数据。有两种类型的数据:仅在会话开始时提示的数据(称为固定值)和总是在移动的数据。 通过扫描一些特殊的条形码,可以更改固定值,这导致了我的问题: 固定值数据在对话框中输入ValidationTextBox(从TextBox派生的自写类)。 到目前为止,我调用对话框,在用户扫描条形码进行更改后,将所有固定值数据呈现给用户。如果某些数据无效,将显示一条

我正在开发一个C#GUI应用程序,它使用Windows CE 5扫描设备的紧凑框架

该应用程序用于反复收集用户输入的数据,主要是通过条形码扫描仪输入的数据。有两种类型的数据:仅在会话开始时提示的数据(称为固定值)和总是在移动的数据。 通过扫描一些特殊的条形码,可以更改固定值,这导致了我的问题:

固定值数据在对话框中输入ValidationTextBox(从TextBox派生的自写类)。 到目前为止,我调用对话框,在用户扫描条形码进行更改后,将所有固定值数据呈现给用户。如果某些数据无效,将显示一条错误消息,在用户输入有效数据之前无法关闭对话框。 我现在的任务是尽快不显示或隐藏对话框。我认为,如果不编写一个新的类来进行验证(就像在GUI控件中发生的那样),就不可能更改完全隐藏的数据并对其进行验证,因此我想用更改的数据调用对话框,对其进行验证,如果一切正常,则将其隐藏。否则,请将其保持打开状态

调用以下方法以显示对话框。如果设置了“验证”标志,则应验证数据,如果有效,则应关闭表单

目前,我在timer.Tick中的“Control ctl=this.Controls[I];”处遇到ObjectDisposedException

    public void display(List<InputRowDTO> fvList, bool validate)
    {
      this.fvList = fvList;
      ctlCount = (fvList.Count > 5 ? 5 : fvList.Count);
      for (int i = 0; i < ctlCount; i++)
      {
        // presenting the data
      }
      // adding some irrelevant eventhandlers

      if (validate)
      {
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        timer.Interval = 900;
        timer.Enabled = true;
        timer.Tick += (EventHandler)delegate(object obj, EventArgs args)
        {
          for (int i = 0; i < ctlCount; i++)
          {
            Control ctl = this.Controls[i]; // <- ObjectDisposedException
            bool valid = true;
            if (!((ValidationTextBox)ctl.Controls[1]).validate(((ValidationTextBox)ctl.Controls[1]).Text))
            {
              valid = false;
            }
            else if (((ValidationTextBox)ctl.Controls[1]).hasPrecepts())
            {
              if (!((ValidationTextBox)ctl.Controls[1]).validatePrecepts(((ValidationTextBox)ctl.Controls[1]).Text))
              {
                valid = false;
              }
            }
            if (validate && valid)
            {
              appendValuesAndClose();
            }
          }
          timer.Dispose();
        };
      }

      if (!this.Visible)
      {
        ShowDialog();
      }
    }

    private void appendValuesAndClose()
    {
      // get data out of the ValidationTextBoxes and write them to a controller, afterwards:
      this.Close();
    }
公共作废显示(列表、bool验证)
{
this.fvList=fvList;
ctlCount=(fvList.Count>5?5:fvList.Count);
对于(int i=0;iControl ctl=this.Controls[i];//让计时器成为对话框的一部分,否?(或者至少在dispose(bool)方法中处理它)。在该代码中,似乎在第一次勾选后处理它。只需在调用appendValuesAndClose()后禁用它即可然后让它在处理所有其他表单对象的地方进行处理。是的,计时器将在第一次勾选后进行处理,我只是用它来延迟appendValuesAndClose()的执行。ObjectDisposedException是在访问表单控件时发生的,因此我认为问题不在于disposed计时器,而在于disposed表单。或者我弄错了吗?我通常用Java编写代码,所以我对C不太熟悉……是的,很容易从“Java ish”编码风格猜出来!;)好吧,这取决于“ctl”在哪里(代码中没有显示)。如果它来自另一个(已关闭)对话框,则它将始终失败,因为对话框已被释放。哦,对不起,我忘记将该行放入代码示例中!我刚刚编辑了代码。Control ctl=this.Controls[I];Timer.Tick事件中的for循环迭代窗体上的所有控件。我尝试使用计时器实现的是在显示对话框后执行循环。我将使计时器成为私有类成员,而不是局部变量(加上我所说的处理)。