我有一个winforms应用程序。
我有一个Populate方法,可以在我的tabcontrol上的每个页面上创建一堆控件。 Populate方法有两个参数 - 标签页和带有一堆标签字符串的List。每个标签页都有一个单独的列表,列表的名称与标签页的名称相同。我想迭代遍历页面并按名称将适当的List传递给Populate方法,即通过名称的字符串传递List。据我所知,我需要反思。
代码:
namespace Test
{
public partial class Form1 : Form
{
List<string> Hongdoe = new List<string>(new string[] { "Chin", "Foa", "Hu", "Dan" });
List<string> Donfu = new List<string>(new string[] { "Faa", "Su", "Pi", "Mou" });
//TabPage1.Name = Hongdoe
//TabPage2.Name = Donfu
foreach (TabPage tp in Tab_Control.TabPages)
{
//I want to tell the program "Find the variable/list that is named as 'tp.Name'
var ListName = typeof(Form1).GetField(tp.Name)
Populate(tp, ListName);
}
}
void Populate (TabPage tp, List<string> list)
{
for (int i = 0; i < list.Count; i++)
{
//Create labels
Label lab = new Label();
lab.Text = list[i];
lab.Location = new Point(i * 10, i * 10));
tp.Controls.Add(lab);
}
}
}
但是它会返回null。我也尝试过使用“GetProperty”,“GetValue”但没有成功。
(在我编辑这个问题之前,我使用了一个变量来简单地演示我的问题)
答案 0 :(得分:3)
您不需要使用反射。您可以使用Dictionary<string, List<string>>
并使用列表名称(标签页名称)作为键和字符串列表作为值。然后,您可以使用字典中的密钥获取列表。
Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
private void ProductList_Load(object sender, EventArgs e)
{
//Initialize dictionary with keys and values
dictionary["page1"] = new List<string> { "string 1", "string 2" };
dictionary["page2"] = new List<string> { "string 3", "string 4" };
//...
}
然后您可以通过这种方式调用Populate
方法:
Populate(tp, dictionary[tp.Name]);
请注意
您不需要将列表传递给方法,并且只需将TabPage
传递给该方法,您就可以使用dictionary[tabPage.Name]
获取列表
您可以在标签页中使用TableLayoutPanel
或FlowLayoutPanel
来添加标签。这样他们就会自动安排。
如果您想使用反射,仅用于学习目的:
var list = (List<string>)this.GetType().GetField("Hongdoe",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).GetValue(this);