1

私は小さなプロジェクトに取り組んでおり、配列からリストを生成しようとすると、作成されたコントロールが追加後に上書きされるため、最後に生成されたものしか表示されません。私が正しくやっていないことがありますか?ここにコード:

    string[] radios = { "fillydelphia_radio", "brony_radio", "luna_radio", "alicorn_radio",
                              "sonic_radioboom", "fractured_frequencies", "ponyville_fm",
                              "everypony_radio", "wonderbolt_radio", "best_pony_radio",
                              "pegabit_sounds" };

    public List()
    {
        InitializeComponent();
        generateInfo();
        int i = 0;
        foreach (string l in radios)
        {
            Label tempname = radioName as Label;
            PictureBox templogo = radioLogo as PictureBox;
            templogo.Name = l + "logo";
            templogo.Location = new Point(templogo.Location.X, templogo.Location.Y + i);
            templogo.ImageLocation = RadiosInfo.getRadioInfo(l, "logo");
            tempname.Name = l + "name";
            tempname.Location = new Point(tempname.Location.X, tempname.Location.Y + i);
            tempname.Text = RadiosInfo.getRadioInfo(l, "name");
            SuspendLayout();
            this.Controls.Add(tempname);
            this.Controls.Add(templogo);
            ResumeLayout();
            i += 50;
        }
    }

    private PictureBox radioLogo = new PictureBox();
    private Label radioName = new Label();
    private Label radioArtist = new Label();
    private Label radioSong = new Label();
    private Label radioGenre = new Label();

長いコードとスペルミスで申し訳ありません。ここに初めて投稿し、私は英語ではありません。

4

1 に答える 1

3

各反復でコントロール (radioName と radioLogo) を再利用しています。したがって、多数のコントロールを追加する代わりに、既存のコントロールのプロパティを変更するだけです。

やりたいことは、毎回新しいコントロールを作成することです。例えば:

foreach (string l in radios)
{
    Label tempname = new Label();
    PictureBox templogo = new PictureBox();
    ....

別の注意として、 foreach ループの前に SuspendLayout() を呼び出し、 foreach ループの後に ResumeLayout() を呼び出す方が効率的です。

于 2013-11-14T01:14:23.740 に答える