1

複数のユーザーで使用することになっているプログラムに取り組んでいます。データベースからユーザーを取得しています。ここまでは順調ですね...

フォームにパネルを動的に追加しています。このパネルにはデータが含まれています。私はそれを達成するためにこのコードを使用しています:

string panel_name = "email_in_" + user_credentials[counter_snel][0];
Panel new_user_panel = new Panel();
new_user_panel.AutoSize = true;
new_user_panel.Dock = System.Windows.Forms.DockStyle.Fill;
new_user_panel.Location = new System.Drawing.Point(0, 0);
new_user_panel.Name = panel_name;
new_user_panel.Visible = false;

Label new_item = new Label();
new_item.AutoSize = true;
new_item.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
string new_item_text = string.Format("{0,0}\n{1,0}\n{2,0}", user_credentials[counter_snel][1], user_credentials[counter_snel][2],user_credentials[counter_snel][9]);
new_item.Text = new_item_text;
splitContainer2.panel_name.Controls.Add(new_item);

お気づきかもしれませんが、このコード行は機能していません。

splitContainer2.panel_name.Controls.Add(new_item);

これを実現するにはどうすればよいですか。パネルemail_in_1を表示したい場合は、それを使用して、email_in_8を非表示にすることができますか?

###編集1###

コードは次のようになります。

string panel_name = "email_in_" + user_credentials[counter_snel][0];
Panel new_user_panel = new Panel();
new_user_panel.AutoSize = true;
new_user_panel.Dock = System.Windows.Forms.DockStyle.Fill;
new_user_panel.Location = new System.Drawing.Point(0, 0);
new_user_panel.Name = panel_name;
new_user_panel.Visible = true;
user_email_in_panels.Add(new_user_panel);
splitContainer2.Panel1.Controls.Add(new_user_panel);

Label new_item = new Label();
new_item.AutoSize = true;
new_item.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
string new_item_text = string.Format("{0,0}\n{1,0}\n{2,0}", user_credentials[counter_snel][1], user_credentials[counter_snel][2],user_credentials[counter_snel][9]);
new_item.Text = new_item_text;
int aantal_panels = 0;
foreach (Panel panel in user_email_in_panels) {
        aantal_panels++;
}
int counter_1 = 0;
foreach (Panel panel in user_email_in_panels) {
        if(counter_1 == (aantal_panels -1)){
               MessageBox.Show("We are here");
               panel.Controls.Add(new_item);
               splitContainer1.Panel1.Controls.Add(panel);
        }
        counter_1++;
}

しかし、どういうわけか、フォームにラベルが表示されません...何かが足りませんか?「WeareHere」というテキストのメッセージボックスが表示されているので、addステートメントになります。

最初の質問以外に別の質問があります。私の質問は、どうすればリストのカウンターを改善できるかということです。

###SeanVaughnの編集

私はそれをこれに更新しました:

public class MyPanelClass {
    public string Name {
        get;
        set;
    }

    public bool Visible {
        get;
        set;
    }

    public string YourLabelsText {
        get;
        set;
    }
}

Label new_item = new Label();
new_item.AutoSize = true;
new_item.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
string new_item_text = string.Format("{0,0}\n{1,0}\n{2,0}", user_credentials[counter_snel][1], user_credentials[counter_snel][2], user_credentials[counter_snel][9]);
new_item.Text = new_item_text;

Panel base_panel = new Panel();    //this is your base panel, you don't need to add this line of code because Visual Studio will do that for you.
List<MyPanelClass> myPanelList = new List<MyPanelClass>();    //this will keep records of all of your panels.

MyPanelClass panel_name = new MyPanelClass();
panel_name.Name = "email_in_" + user_credentials[counter_snel][0]; ;
panel_name.Visible = true;
panel_name.YourLabelsText = string.Format("{0,0}\n{1,0}\n{2,0}", user_credentials[counter_snel][1], user_credentials[counter_snel][2], user_credentials[counter_snel][9]);

//Now add the new created panel to the list.
myPanelList.Add(panel_name);

base_panel.Name = myPanelList[counter_snel].Name;
base_panel.Visible = myPanelList[counter_snel].Visible; //You probably don't need this because base_panel will always be visible
new_item.Text = myPanelList[counter_snel].YourLabelsText;

しかし、私はまだ何も見えません...それが公の場で実行されることは重要ですか?私はそうは思いませんが、それはすべての可能性を排除したいです...

4

2 に答える 2

1

Listすべてのパネルを追跡するを使用します。

List<Panel> myPanels = new List<Panel>();

パネルを追加する必要があるときはいつでも、これを行ってください:

mypanels.Add(yourPanel);

次に、他の問題について、次のような関数を作成します。

private void HideAllOtherPanels(List<Panel> panelList, Int index /*the index of the panel you want to show*/)
{
    foreach(Panel panel in panelList)
        if(panel.Visible) panel.Hide();

    panelList[index].Show();
}

たくさんの新しいパネルを作成しているようです。私のアドバイスですが、そうしないでください。システムに多くの負荷がかかっています。

代わりにクラスを作成します。

public class MyPanelClass
{
    public string Name
    {
        get; set;
    }

    public bool Visible
    {
        get; set;
    }

    public string YourLabelsText
    {
        get; set;
    }
}

クラスを作成したら、フォーム上にbase_panelを作成します。これにより、意図に基づいてコンテンツが変更されます。そして、あなたがする必要があるのは、新しいパネルを作成するのではなく、パネルのコンテンツを変更することだけです。他のパネルデータをに保存しますList<MyPanelClass>

だからあなたはこれをするでしょう:

Panel base_panel = new Panel();    //this is your base panel, you don't need to add this line of code because Visual Studio will do that for you.
List<MyPanelClass> myPanelList = new List<MyPanelClass>();    //this will keep records of all of your panels.

MyPanelClass panel_name = new MyClassPanel();
panel_name.Name = "email_in_" + user_credentials[counter_snel][0];;
panel_name.Visible = false;
panel_name.YourLabelsText = string.Format("{0,0}\n{1,0}\n{2,0}", user_credentials[counter_snel][1], user_credentials[counter_snel][2],user_credentials[counter_snel][9]);

//Now add the new created panel to the list.
myPanelList.Add(panel_name);

これで、保存されたPanelをアクティブ化する必要があるときはいつでも、次のようにします。

base_panel.Name = myPanelList[yourPanelsIndex].Name;
base_panel.Visible = myPanelList[yourPanelsIndex].Visible; //You probably don't need this because base_panel will always be visible
yourLabel.Text = myPanelList[yourPanelsIndex].YourLabelsText;

このコードは、マシン上ではるかにかさばらず、処理も簡単です。

于 2012-10-01T17:49:20.617 に答える
0

このようなものを試してアイテムを追加します。

var panel = splitContainer2.Controls.FirstOrDefault(p => p is Panel && ((Panel)p).Name == panel_name);
if(panel != nul) 
{
    panel.Controls.Add(new_item);
}

与えられた特定のパネルを非表示にするにはpanel_name

foreach(var control in splitContainer2.Controls)
{
    if(control is Panel)
    {
        ((Panel)control).Visible = ((Panel)control).Name == panel_name;
    }
}
于 2012-10-01T17:59:43.043 に答える