winforms 如何读取ListView列标题及其值?

knsnq2tg  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(163)

我一直在尝试找到一种方法,从所选的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行和每个列标题。

z4iuyo4d

z4iuyo4d1#

在您的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的方式并不是很好,即使它能工作。我建议你将每个参与的TextBoxes添加到一个List<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;
fruv7luv

fruv7luv2#

试试这个来问候所有的价值观。

foreach (ListViewItem lvi in listView.Items) 
{               
    SaveFile.WriteLine(lvi.Text + "_" + lvi.SubItems[1].Text);
}

相关问题