面板的动态名称

时间:2012-10-01 17:41:32

标签: c# winforms dynamic label panel

我正在开发一个应该与多个用户一起使用的程序。我从数据库中获取用户。到目前为止一切都很好......

我正在动态地向表单添加一个面板,它会保存一些数据。我正在使用这段代码来实现这一目标:

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不可见?

### EDIT 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++;
}

但不知怎的,我没有在表格中看到任何标签......我错过了什么吗?显示带有文本We are Here的messsagebox,因此它来自add语句....

除了我的第一个问题,我还有另外一个问题。我的问题是,如何才能使列表的计数器更好?

###编辑Sean Vaughn

我已将其更新为:

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;

但我仍然没有看到任何东西...... 它在公共空白中执行是否重要?我不这么认为,但它想要消除所有可能性......

2 个答案:

答案 0 :(得分: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,根据您的意图更改其内容。 然后,您需要做的就是更改面板的内容,而不是创建新的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;

此代码在机器上不那么笨重,也易于处理。

答案 1 :(得分: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;
    }
}
相关问题