如何读取 ListView Column Headers 及其值?
How can I read ListView Column Headers and their values?
我一直在努力寻找一种方法来从选定的 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
行列 headers。如果他们的列 header 与 TextBox.Tag 匹配,则在他们尊重的文本框中显示列值。
最终代码如下所示:
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
行和每一列 header。
循环你的 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;
我一直在努力寻找一种方法来从选定的 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
行列 headers。如果他们的列 header 与 TextBox.Tag 匹配,则在他们尊重的文本框中显示列值。
最终代码如下所示:
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
行和每一列 header。
循环你的 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;