在Listview中选择子项并更改值

时间:2014-02-23 00:49:02

标签: c# .net winforms listview subitem

我在“详细信息”模式中有一个列表视图,如下所示:

#################
Name  #  Property
#################
#Itm1 # Subitm1
#Itm2 # Subitm2
#################

很简单,但我遇到的问题是我无法在运行时在列表中选择“Subitm1”。我可以选择并突出显示第一列中的每个项目,但点击第二列中的任何项目都不会做任何事情(我希望它能像第一列中一样突出显示该项目)。

具体来说,我正在尝试为用户添加能够双击子项并直接在列表视图中更改其值的功能。我在这里找不到具体的设置吗?

1 个答案:

答案 0 :(得分:7)

如果要在单击子项目时选择整行,请尝试使用FullRowSelect ListView属性。 要处理双击子项目,请尝试以下操作:

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    ListViewHitTestInfo hit = listView1.HitTest(e.Location);
    // Use hit.Item
    // Use hit.SubItem
}

如果您希望允许最终用户在列表视图中编辑子项目的文本,我担心最简单的方法是使用网格控件。另一种方法是尝试这样的事情:

private readonly TextBox txt = new TextBox { BorderStyle = BorderStyle.FixedSingle, Visible = false };

public Form1()
{
    InitializeComponent();
    listView1.Controls.Add(txt);
    listView1.FullRowSelect = true;
    txt.Leave += (o, e) => txt.Visible = false;
}

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    ListViewHitTestInfo hit = listView1.HitTest(e.Location);

    Rectangle rowBounds = hit.SubItem.Bounds;
    Rectangle labelBounds = hit.Item.GetBounds(ItemBoundsPortion.Label);
    int leftMargin = labelBounds.Left - 1;
    txt.Bounds = new Rectangle(rowBounds.Left + leftMargin, rowBounds.Top, rowBounds.Width - leftMargin - 1, rowBounds.Height);
    txt.Text = hit.SubItem.Text;
    txt.SelectAll();
    txt.Visible = true;
    txt.Focus();
}