0

複数のオブジェクトのコントロールのある種のリストを作成しようとしています。オブジェクトは画面に表示されるパターン用であり、期間、オフセット、次のパターン、パターンインデックスなどのいくつかの異なる属性があります。GUIで各パターンのさまざまな属性を簡単に設定できるように、コントロールの反復可能なリストを作成できるようにしたいと思います。これが私が作成しているフォームのラフドラフトです。これが私が作成しているフォームへのリンクです。

ここに画像の説明を入力してください

各行は、パターンの属性のコレクションです。どういうわけか、コード内のこれらの各行を繰り返し処理し、ユーザー入力に基づいて各パターンの属性を設定できるようにしたいと思います。これまで読んだことから、ItemsControlツールを使用して、どういうわけかそれをGUIにバインドしたいと思いますが、それを行う方法や、それが私がすべきことであるかどうかはよくわかりません。私が現在使用しているのは、複数のパネルを備えたTableLayoutPanelですが、これらのツールにはあま​​り制御がないようです。各行のコントロールをグループ化してから、各行を効率的に反復するにはどうすればよいですか?

4

1 に答える 1

0

さて、私はあなたがスポーツのために行っていたものを達成したと思います。私はWinFormsよりもWPFをよく知っていますが、これが私が自分で「独学」した私の解決策です。

ソリューションでこれを実行しても問題はないと想定します。

まず、ユーザーコントロールを作成します。WinFormプロジェクトを右クリック>[追加]>[ユーザーコントロール]を実行しました。これは、行を構成するコンテンツを追加する場所です。したがって、次のようになります。ユーザーコントロールにRowContentという名前を付けました。

コントロール

あなたの名前があなたのコントロールであることを確認してください。そのため、チェックボックスには、stprIndex_chkBox、enable_chkBoxなどの名前を付けました。

次に、を使用して各コントロールに必要な機能を実装する必要があります。だから、あなたはあなたのstprIndex_chkBox.Text、そしてenable_chkBox.Checked初心者のためのの値を変えたいと思うでしょう。また、numericUpDownsにアクセスする必要がValueあります。そのため、RowContent.csで、フォームから必要なデータに応じてゲッターとセッターを追加しました。したがって、ここにアクセサーのスニペットがあります(さらに追加することを忘れないでください)

public partial class RowContent : UserControl
{
    public RowContent()
    {
        InitializeComponent();
    }

    public string SetChkBox1Text
    {
        set { stprIndex_chkBox.Text = value; }
    }

    public bool IsEnabledChecked
    {
        get { return enable_chkBox.Checked; }
    }
}

ご覧のとおり、これらを使用すると、RowContentクラスの外部の変数にアクセスできます。TablePanelLayoutコントロールに移りましょう。

RowContentを作成したのと同じ方法で追加のユーザーコントロールを作成しましたが、今回はContentCollectionという名前を付けました。ユーザーコントロールをtrueに設定AutoSizeし、TableLayoutPanel(tableLayoutPanel1という名前)をその上にドロップしました。

時間を節約するために、次のようにすべてのコントロールを動的に行に追加しました。

public partial class ContentCollection : UserControl
{
    public ContentCollection()
    {
        InitializeComponent();
        RowContent one = new RowContent();
        RowContent two = new RowContent();
        RowContent three = new RowContent();
        RowContent four = new RowContent();
        RowContent five = new RowContent();
        RowContent six = new RowContent();
        tableLayoutPanel1.Controls.Add(one);
        tableLayoutPanel1.Controls.Add(two);
        tableLayoutPanel1.Controls.Add(three);
        tableLayoutPanel1.Controls.Add(four);
        tableLayoutPanel1.Controls.Add(five);
        tableLayoutPanel1.Controls.Add(six);
        tableLayoutPanel1.SetRow(one, 0);
        tableLayoutPanel1.SetRow(two, 1);
        tableLayoutPanel1.SetRow(three, 2);
        tableLayoutPanel1.SetRow(four, 3);
        tableLayoutPanel1.SetRow(five, 4);
        tableLayoutPanel1.SetRow(six, 5);
    }
}

これは私に与えます:

ここに画像の説明を入力してください

ここで、これらのものを動的に追加していることがわかります。WinFormで使用するときに、このユーザーコントロールを「カスタマイズ」する方法を想像していただければ幸いです。この同じファイルに、他のユーザーコントロールと同じように、実行したい内容に応じて、ゲッター/セッター/関数をさらに追加する必要があります。などAddAdditionalRow(RowContext rc)など。私は実際にだまして、これを最終的に速くするためにtableLayoutPanel変更しました。public

最後に、カスタムオブジェクトを保持するContentCollectionができたので、それをフォームに追加する必要があります。

フォームに移動し、ツールボックスを開いて一番上までスクロールすると、フォームが表示されます。メインフォームとvio'laにドラッグアンドドロップします。これで、RowContentを反復処理するのは、かなり簡単です。ユーザーコントロールをフォームにドラッグアンドドロップしたので、名前(userControl12)を付けて、すぐにコントロールにアクセスできるようになりました。他のすべてのチェックボックスにチェックマークを追加して、ステッパーインデックスを動的に変更する方法を確認してください。

public partial class Form1 : Form
{
    static int i = 0;
    public Form1()
    {
        InitializeComponent();
        foreach (RowContent ctrl in userControl11.tableLayoutPanel1.Controls)
        {
            ctrl.SetChkBox1Text = i.ToString();
            if (!ctrl.IsEnabledChecked && i % 2 == 0)
                ctrl.IsEnabledChecked = true;
            i++;
        }
        foreach (RowContent ctrl in userControl12.tableLayoutPanel1.Controls)
        {
            ctrl.SetChkBox1Text = i.ToString();
            i++;
        }
    }
}

ここに画像の説明を入力してください

私はこれがそこにある最高のデザインであるとは主張していません...そうではないので、しかしそれはそのようなことをする方法を示しています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-08-14T19:16:09.663 に答える