C# 检索Listview项的列并显示在另一个表单c上的组合框中

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;

我有两个表单:一个表单包含listView,另一个表单包含comboBox

我希望将listView的第一列加载到第二个表单的comboBox中

这是我的尝试:

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());