C# 使用列表保存多个复选框的状态

C# 使用列表保存多个复选框的状态,c#,winforms,C#,Winforms,我正在制作一个应用程序来存储用户通过表单输入的数据。因为我在多个页面上有很多复选框和表单延伸。我想保存这些复选框的状态,这样当我转到下一页并返回时,以前选中的复选框应该被选中。 我试图通过使用List和bool[]来实现这一点。但由于某些原因,它就是不起作用。我不知道我错过了什么 public void Ucitavanje34(bool[] Lista,List<CheckBox> check ) { foreach (CheckBox ajtem in c

我正在制作一个应用程序来存储用户通过表单输入的数据。因为我在多个页面上有很多复选框和表单延伸。我想保存这些复选框的状态,这样当我转到下一页并返回时,以前选中的复选框应该被选中。 我试图通过使用
List
bool[]
来实现这一点。但由于某些原因,它就是不起作用。我不知道我错过了什么

public void Ucitavanje34(bool[] Lista,List<CheckBox> check )
    {
        foreach (CheckBox ajtem in check)
        {
            int i = 0;
            if (ajtem.Checked==true)
            {
                Lista[i] = true;
                ++i;
            }
            else
            {
                Lista[i]= false;
                ++i;
            }
        }
        MessageBox.Show(string.Join(Environment.NewLine,Checkboxstrana3,boolarray ));            
    }

public void Ucitavanje43(bool[] Lista, List<CheckBox> check)
    {
        foreach (bool ajtem in Lista)
        {
            int i = 0;
            if (ajtem == true)
            {
                check[i].Checked = true;
                ++i;
            }
            else
            {
                check[i].Checked = false;
                ++i;
            }
        }
        MessageBox.Show(string.Join(Environment.NewLine,Stanje));
    }
public void Ucitavanje34(bool[]Lista,列表检查)
{
foreach(复选框中的ajtem)
{
int i=0;
如果(ajtem.Checked==true)
{
Lista[i]=真;
++一,;
}
其他的
{
Lista[i]=假;
++一,;
}
}
Show(string.Join(Environment.NewLine,Checkboxstrana3,boolarray));
}
公共无效Ucitavanje43(布尔[]列表,列表检查)
{
foreach(列表中的bool ajtem)
{
int i=0;
如果(ajtem==true)
{
选中[i]。选中=真;
++一,;
}
其他的
{
check[i]。Checked=false;
++一,;
}
}
Show(string.Join(Environment.NewLine,Stanje));
}
我知道我可以手动操作(1by1),但这太麻烦了


我得到的输出很愚蠢,我不知道我做错了什么。

您正在为每个复选框将
i
重置为零。最好使用单个for循环,并对
列表
bool[]
上的索引使用
i
,因为您的问题在for循环中 你正在做int i=0;在forloop内部。这将始终从列表中获取第一个元素

public void Ucitavanje34(bool[] Lista,List<CheckBox> check )
{
   int i = 0; //this line
   foreach (CheckBox ajtem in check)
   {          
      Lista[i] = ajtem.Checked;
      ++i;      
   }
   MessageBox.Show(string.Join(Environment.NewLine,Checkboxstrana3,boolarray ));            
}
public void Ucitavanje34(bool[]Lista,列表检查)
{
int i=0;//这一行
foreach(复选框中的ajtem)
{          
Lista[i]=已检查的项目;
++一,;
}
Show(string.Join(Environment.NewLine,Checkboxstrana3,boolarray));
}

其他答案已经指出了您的问题,我只是想提供一种不同的方法,因为您的任务是一个很好的示例,您可以从使用LINQ中获益

bool[] Lista = check.Select(x => x.IsChecked).ToArray();
如果您对此感兴趣,请参阅

public Dictionary<string, bool> Save(params CheckBox[] check)
{
    Dictionary<string, bool> result = new Dictionary<string, bool>();

    foreach (CheckBox item in check)
        result.Add(item.Name, item.Checked);

    return result;
}

public void Apply(Dictionary<string, bool> savedResults)
{
    foreach (var item in savedResults)
    {
        var check = this.Controls[item.Key];
        // var check = this.Controls.Find(item.Key, true).FirstOrDefault();  //easier way to find checkboxes
        if(check != null && check.GetType().ToString() == "System.Windows.Forms.CheckBox")
        {
            ((CheckBox)check).Checked = item.Value;
        }
    }
}
现在,将
结果保存到所需的任何位置

如何使用它:

result = Save(checkBox1, checkBox2, checkBox3, checkBox4);
Dictionary<string, bool> result = ... // Load from somewhere
Apply(result);
字典结果=…//从某处装载
应用(结果);

使用字典?这是一个常规编程错误,可以通过调试修复。。另请参阅已接受的答案,了解简化方法,如果您只有几个静态复选框,该方法可能有效。您刚才建议在注释中使用
字典
。我相信这是存储状态的好方法,但我不知道如何将
复选框
存储为键(键应该是唯一的),您可以使用控件名称作为键。Dictionary@CodeNameJack好的,我已经修好了,但仍然不起作用。我会用字典试试。另外,如果其他部分不起作用的话,你不需要那个。您只需分配