1

パネルから 2 つのテキスト ボックスを削除しようとする Windows フォーム アプリケーションのメソッドがあります。

このメソッドでは、パネル内のすべてのコントロールをループします。パネルは必ず 2 枚ずつ取り外して追加することになっていますが、取り外すときは、ボタンを押すとランダムに 1 つまたは 2 つのコンテナーが削除されます。

テキストボックスを削除するコードは次のとおりです。

private void removeRows()
        {
            string descName = "Desc" + (textBoxCounter - 1).ToString();
            string costName = "Cost" + (textBoxCounter - 1).ToString();

            if (textBoxCounter >= 0)
            {
                foreach (Control c in costItems.Controls)
                {
                    if (c.Name == descName)
                    {
                        // Remove the control from the panel and dispose of it
                        panel.Controls.Remove(c);
                        c.Dispose();

                    }
                    if(c.Name == costName)
                    {
                        // Remove the control from the panel and dispose of it
                        panel.Controls.Remove(c);
                        c.Dispose();
                    }
                }

                // Decrement the counter
                // This happens only once since two controls need to be removed
                if (textBoxCounter == 0)
                    textBoxCounter = 0;
                else
                    textBoxCounter--;
            }
            else
                MessageBox.Show("There are no more rows to remove", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            testlabel1.Text = textBoxCounter.ToString();
            testlabel2.Text = panel.Controls.Count.ToString();
        }

ボタンを追加するコードは次のとおりです。

private void addRows(string desc, string cost)
    {
        if (textBoxCounter >= maxExpenses)
        {
            MessageBox.Show("Maximum number of expenses entered", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            TextBox Desc = new TextBox();
            TextBox Cost = new TextBox();

            // Give the text boxes names
            Desc.Name = "Desc" + textBoxCounter.ToString();
            Cost.Name = "Cost" + textBoxCounter.ToString();

            // Format the text boxes
            Desc.Width = panel.Width / 2;
            Cost.Width = panel.Width / 4;

            // Add the items to the costItems panel
            panel.Controls.Add(expenseDesc);
            panel.Controls.Add(expenseCost);

            // Add the items to the expenses dictionary
            panel.Add(Desc, Cost);

            // Increment the text box counter variable
            textBoxCounter++;
            testlabel1.Text = textBoxCounter.ToString();
            testlabel2.Text = costItems.Controls.Count.ToString();
        }
    }

知っておくべきいくつかの情報。常に 2 つのテキスト ボックスが追加および削除され、互いに関連しています。textBoxCounter は 0 に初期化されるため、最初の 2 つのボックス名は "Desc0" と "Cost0" になります。

最初にボタンを押して行を削除すると、1 つのテキスト ボックスが削除され、もう一度押すと 2 つが削除され、1 つだけが削除される場合があります。

デバッグを試みたところ、パネル内のすべてのコントロールを反復処理する foreach ループが、コントロールの全数に満たない 1 回だけループしているように見えることに気付きました。

私のコードに関するヘルプは素晴らしいでしょう。

4

2 に答える 2