2

我在“详细信息”模式下有一个列表视图,看起来像:

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

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

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

4

1 回答 1

8

如果要在单击子项时选择整行,请尝试使用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();
}
于 2014-02-23T02:07:23.540 回答