【发布时间】:2012-10-01 17:41:32
【问题描述】:
我正在开发一个应该与多个用户一起使用的程序。我正在从数据库中获取用户。到目前为止一切顺利...
我正在向表单动态添加一个面板,该面板将保存一些数据。我正在使用这段代码来实现:
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++;
}
但不知何故,我没有看到表单中显示任何标签......我错过了什么吗?显示了带有 We are Here 文本的消息框,所以它出现在 add 语句中......
除了我的第一个问题,我还有另一个问题。我的问题是,我怎样才能使列表的计数器更好?
### 为肖恩·沃恩编辑
我已将其更新为:
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;
但我还是什么都没看到... 它在公共空白中执行是否重要???我不这么认为,但它想消除所有的可能性......
【问题讨论】:
-
您是否尝试过使用
RegisterName(panel_name, new_user_panel)然后使用(Panel)splitContainer1.FindName(panel_name)来检索它? -
@Bob.,我明天会看看它,因为如果今天没有时间的话。但感谢您与我们一起思考 ;-)
-
没问题!我发现如果您要向 WPF 动态添加内容,则必须对其进行注册,以便可以按名称检索它。从看起来你想做的事情来看,你需要的只是一个面板名称的 List
,使用 FindName() 检索它们,然后将它们全部设置为 Visiblity.Collapsed,并将你想要的面板设置为 Visiblity。可见。 -
@Bob。你可以在答案中设置它吗?这样我就可以明白你的意思了?
标签: c# winforms dynamic label panel