0

通常の Windows フォームがいくつかあります。そのうちの 1 つのデータ入力フィールドをクリアするには、次のようなコードを使用します。

    ClearInputFields(this);

    private void ClearInputFields(Control Page)
    {
        try
        {
            foreach (Control ctrl in Page.Controls)
            {
                if (ctrl is Button)                    
                    continue;
                if (ctrl is DataGridView)
                    continue;
                if (ctrl is ListBox)
                    continue;

                if (ctrl is TextBox)
                {
                    ((TextBox)(ctrl)).Text = string.Empty;
                }
                else if (ctrl is ComboBox)
                {        
                    ((ComboBox)(ctrl)).SelectedIndex = 0;
                }
                else if (ctrl is CheckBox)
                {
                    ((CheckBox)(ctrl)).Checked = false;
                }
                else if (ctrl.Controls.Count > 0)
                {
                    ClearInputFields(ctrl);
                }                                       
            }
        }
        catch (Exception ex)
        {
            TraceFile.Error("ExceptionLog", ex);
        }
    }

フォームの 1 つで、期待どおりに動作します。もう一方のフォームでは、9 つ​​の ComboBox のうち 2 つがリセットされず、6 つの CheckBox のいずれもクリアされません。

デバッガーでステップスルーすると、フォームに含まれるコントロールのリストに特定のコントロールが含まれていないように見えます.?!

フォームを比較しましたが、これらのコントロールのプロパティに違いはありません。認識されないコンボボックスの 1 つはデータバインドされていますが、1 つはデータバインドされていませんが、これはリセットされたものにも当てはまります。

デザイナーを調べたところ、すべてのコントロールが「this.Controls.Add(this.name_of_control);」として宣言されています。

最後の「else if」を省略してみました (このフォームにはパネル、グループ ボックス、またはその他のコンテナーはありません)。動作に違いはありません。

チェックボックスを明示的に "Checked = false" に設定し、ComboBoxes を "SelectedIndex = 0" に設定すると、フォームのコントロールを反復処理するときに期待どおりに動作しません。

編集 - 補遺: すべてのコントロールは、実行時ではなくデザイナーで作成されます。前述のとおり、フォームにはコンテナがありません。

これは単純で明白な問題の 1 つであると思いますが、これまでのところ、私はそれを見ていません。

任意の洞察をいただければ幸いです。ありがとう!

4

2 に答える 2

0

おそらく、コントロールのプロパティを変更すると、コントロールの順序がthis.Controls変更されるため、すべてのコントロールを通過するわけではありません。おそらくこれは当てはまらないかもしれませんがControl ctrl in Page.Controls、最初にしかチェックされない可能性があります。

于 2012-06-07T18:29:54.923 に答える
0

コレクションを変更する可能性があるコレクションのアイテムに対して何かをしなければならないときはいつでも、通常、コレクションをコピーしてから、このコピーをループします。あなたの場合、これは私が通常書くコードです:

ClearInputFields(this);

private List<Control> ControlsForPage(Control Page)
{
        List<Control> result = new List<Control>();
        foreach (Control ctrl in Page.Controls)
              result.Add(ctrl);
        return result;
{

private void ClearInputFields(Control Page)
{
    try
    {
        List<Control> ctrlsCopy = ControlsForPage(Page);
        foreach (Control ctrl in ctrlsCopy)
        {
            if (ctrl is Button)                    
                continue;
            if (ctrl is DataGridView)
                continue;
            if (ctrl is ListBox)
                continue;

            if (ctrl is TextBox)
            {
                ((TextBox)(ctrl)).Text = string.Empty;
            }
            else if (ctrl is ComboBox)
            {        
                ((ComboBox)(ctrl)).SelectedIndex = 0;
            }
            else if (ctrl is CheckBox)
            {
                ((CheckBox)(ctrl)).Checked = false;
            }
            else if (ctrl.Controls.Count > 0)
            {
                ClearInputFields(ctrl);
            }                                       
        }
    }
    catch (Exception ex)
    {
        TraceFile.Error("ExceptionLog", ex);
    }
}

とにかく、ここで何が起こっているのかを理解するために、リセットを行う前に Controls のコピーを作成し、リセット後のページの Controls コレクションと比較してみます。

于 2012-06-08T05:58:13.407 に答える