我怎么能读的ListView列标题,它们的值?(How can I read ListView Co

2019-10-23 03:28发布

我一直在试图找出一种方法来读取所选择的数据ListView的行,并显示在他们的尊重,每个值TextBox ,即可轻松编辑。

第一个和最简单的方法是这样的:

ListViewItem item = listView1.SelectedItems[0];

buyCount_txtBox.Text = item.SubItems[1].Text;
buyPrice_txtBox.Text = item.SubItems[2].Text;
sellPrice_txtBox.Text = item.SubItems[3].Text;

没有什么不对的代码,但我周围有40个或更多TextBoxes应显示的数据。 编码全部40个左右会变得非常乏味。

该解决方案,我想出了,是让所有TextBox控件在我的用户控制像这样:

    foreach (Control c in this.Controls)
    {
        foreach (Control childc in c.Controls)
        {
            if (childc is TextBox)
            {
            }
        }
    }

然后,我需要循环选定ListView列列标题。 如果他们的列标题匹配TextBox.Tag然后显示在他们的尊重TextBox中的列的值。

最终代码会是这个样子:

    foreach (Control c in this.Controls)
    {
        foreach (Control childc in c.Controls)
        {

          // Needs another loop for the selected ListView Row

            if (childc is TextBox && ColumnHeader == childc.Tag)
            {
               // Display Values
            }
        }
    }

所以,那么我的问题是:我如何遍历选定ListView行和每一列的标题。

Answer 1:

循环您ColumnHeaders简直就像下面这样:

foreach(  ColumnHeader  lvch  in listView1.Columns)
{
    if (lvch.Text == textBox.Tag) ; // either check on the header text..
    if (lvch.Name == textBox.Tag) ; // or on its Name..
    if (lvch.Tag  == textBox.Tag) ; // or even on its Tag
}

但是你的方式循环在你的TextBoxes是不是即使它的工作原理完全好的。 我建议你添加的每个参与的TextBoxesList<TextBox> 。 是的,这意味着增加40个项目,但你可以使用AddRange也许是这样的:

为了填补名单myBoxes:

List<TextBox> myBoxes = new List<TextBox>()

public Form1()
{
    InitializeComponent();
    //..
    myBoxes.AddRange(new[] {textBox1, textBox2, textBox3});
}

或者,如果你真的想避免AddRange也保持动态,也可以写一个微小的递归..:

private void CollectTBs(Control ctl, List<TextBox> myBoxes)
{
    if (ctl is TextBox) myBoxes.Add(ctl as TextBox);
    foreach (Control c in ctl.Controls) CollectTBs(c, myBoxes);
}

现在你的最后的圈是超薄,快速:

foreach(  ColumnHeader  lvch  in listView1.Columns)
{
    foreach (TextBox textBox in myBoxes)
        if (lvch.Tag == textBox.Tag)  // pick you comparison!
            textBox.Text = lvch.Text;
}

更新:因为你真正想要的SubItem值的解决方案可能是这样的:

ListViewItem lvi = listView1.SelectedItems[0];
foreach (ListViewItem.ListViewSubItem lvsu in  lvi.SubItems)
    foreach (TextBox textBox in myBoxes)
       if (lvsu.Tag == textBox.Tag)  textBox.Text = lvsu.Text;


文章来源: How can I read ListView Column Headers and their values?