Windows CE 5 スキャナー デバイス用の Compact Framework を使用して C# GUI アプリケーションを開発しています。
このアプリケーションは、主にバーコード スキャナーによって、ユーザーが入力したデータを繰り返し収集するために使用されます。データには 2 つのタイプがあります。セッションの開始時にのみプロンプトが表示されるデータ (固定値と呼びます) と、常に変化するデータです。固定値は、いくつかの特別なバーコードをスキャンすることで変更できます。これにより、問題が発生します。
固定値データは、ダイアログで ValidationTextBoxes (TextBox から派生した自己記述クラス) に入力されます。これまでは、変更のためにバーコードをスキャンした後、ダイアログを呼び出してすべての固定値データをユーザーに提示していました。一部のデータが無効な場合、エラー メッセージが表示され、ユーザーが有効なデータを入力するまでダイアログを閉じることができません。ダイアログを表示しないようにするか、できるだけ早く非表示にするタスクがありました。データを完全に非表示に変更して、検証用の新しいクラスを作成せずに検証することはできないと思います (GUI コントロールで発生するように)。そのため、変更されたデータでダイアログを呼び出し、検証し、すべて問題なければ、非表示にします。それ以外の場合は、今までどおり開いたままにしてください。
次のメソッドは、ダイアログを表示するために呼び出されます。「検証」フラグが設定されている場合、データは検証され、有効な場合はフォームが閉じられます。
現在、「Control ctl = this.Controls[i];」で ObjectDisposedException が発生しています。timer.Tick で。
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();
}