0

我正在为 Windows CE 5 扫描仪设备使用 Compact Framework 开发 C# GUI 应用程序。

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

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

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

目前我在“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();
    }
4

0 回答 0