C# 检索Listview项的列并显示在另一个表单c上的组合框中
我有两个表单:一个表单包含listView,另一个表单包含comboBox 我希望将listView的第一列加载到第二个表单的comboBox中 这是我的尝试:C# 检索Listview项的列并显示在另一个表单c上的组合框中,c#,winforms,combobox,C#,Winforms,Combobox,我有两个表单:一个表单包含listView,另一个表单包含comboBox 我希望将listView的第一列加载到第二个表单的comboBox中 这是我的尝试: comboBox1.Items.Add(Form2.listView2.columnHeader1); 然而,这是行不通的。Form2.ListView由于其保护级别而不可访问。如有建议,将不胜感激 在第二个表单中创建一个公共方法,并让该方法设置comboboxitems 表格1: bool Do = true; int i = 0;
comboBox1.Items.Add(Form2.listView2.columnHeader1);
然而,这是行不通的。Form2.ListView由于其保护级别而不可访问。如有建议,将不胜感激 在第二个表单中创建一个公共方法,并让该方法设置comboboxitems 表格1:
bool Do = true;
int i = 0;
Form2 F = new Form2();
while (Do)
{
try
{
F.AddItem(listView1.Columns[i].Name);
i++;
}
catch
{
Do = false;
}
}
表格2:
public void AddItem(string ToAdd)
{
comboBox1.Items.Add(ToAdd);
}
快速而肮脏的解决方案: 在winforms设计器中转到listView2的属性并查找修饰符。然后选择公共,如下图所示: 现在它将是可访问的 更优雅的解决方案: 在第一个表单中创建一个只有getter的属性。在此getter中,您可以安全地返回columnHeader1: 或: 编辑: 似乎您更希望获得该列中的所有值。因此,在这种情况下,您必须返回所有值,如下所示:
public List<string> AlllValuesFromColumn
{
get
{
int indexOfColumn = listView2.Columns.IndexOf(this.columnHeader1);
return listView2.Items.OfType<ListViewItem>().Select(x => x.SubItems[indexOfColumn].Text).ToList();
}
}
编辑2:
但我个人更喜欢的解决方案是将数据源保存在一个额外的变量中。这是可以传递的。没有什么神奇之处。1表单包含一个列表视图,那么表单2是您的1表单吗?listView2是静态的吗?还是将变量命名为Form2?Form1具有组合框。Form2具有listView。我希望Form1上的comboBox检索Form2上listView的第一列。
public ColumnHeader ColumnHeader { get { return this.columnHeader1; }}
public List<string> AlllValuesFromColumn
{
get
{
int indexOfColumn = listView2.Columns.IndexOf(this.columnHeader1);
return listView2.Items.OfType<ListViewItem>().Select(x => x.SubItems[indexOfColumn].Text).ToList();
}
}
comboBox1.Items.AddRange(Form2.AlllValuesFromColumn.ToArray());