有一个所有checklistbox的列表



我正在尝试设置一个外循环,迭代我在Visual Studio 2008 c#中创建的windows窗体应用程序中的所有复选框。

当前有一个列表的所有框我:

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
boxes.Add(checkedListBox1);
boxes.Add(checkListBox2);
boxes.Add(checkedListBox3);
// this process continues until i've reached checkedListBox7.
}

是否有更好/更干净的方法来做这件事?

您可以遍历表单或面板中的所有控件,检查它是否为CheckedListBox并将其添加到列表中。当然,你可以添加额外的检查例如,如果name以"checkedListBox"开头等。

我不知道你的目标是什么,但对我来说,我希望在重复向列表添加对象之前清除列表。

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
boxes.Clear();
foreach (var control in this.Controls)
{
if(control is CheckedListBox)
boxes.Add((CheckedListBox)control);
}
}

我建议使用Type.GetFields方法。(这里是微软官方文档的链接,可以了解更多信息。https://learn.microsoft.com/en us/dotnet/api/system.type.getfields?view=net - 6.0)

简而言之,Type.GetFields将获得定义类型中的所有公共字段。它们不会按顺序返回,所以这是它的缺点,但是您仍然可以根据返回的内容添加字段。我将尝试使用您的代码来展示这将是什么样子

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
//Get the "type" of this class
Type objType = typeof(this);

//Get all fields in this class
FieldInfo[] info = objType.GetFields();

//This is just to make the next line shorter
BindingFlags battr = BindingFlags.Public | BindingFlags.Instance;
//This will need to get a field with the type you want to add
FieldInfo desiredType = typeof(this).GetField(nameof(checkedListBox1), battr);

//loop through each field
foreach(var item in info)
{
//if the current field is the same as the field type you want
if(item.FieldType == desiredType.FieldType)
{
boxes.add(item);
}
}
}

老实说,这比仅仅浏览它们中的七个要长,并且注释已经解决了我对代码的其他关注,但是假设您已经弄清楚了所有这些,并且您确实需要遍历它们中的每一个,这可能是我发现的最好的方法来完成您的问题。

我试图建立一个迭代所有的外循环复选框是我在Visual Studio的windows窗体应用程序中创建的2008 C # .

关注outerloopthis process continues until i've reached checkedListBox7部分,我猜你在寻找类似的东西:

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
boxes.Clear();
for(int i=1; i<=7; i++) {
CheckedListBox clb = this.Controls.Find("checkedListBox" + i.ToString(), true).FirstOrDefault() as CheckedListBox;
if (clb != null) {
boxes.Add(clb);
}
}
}

注意,这将根据名称找到控件。不管它们嵌套得有多深,即使它们都在不同的容器中。

相关内容

  • 没有找到相关文章

最新更新