0

昨天我尝试实现一个支持子项编辑的新列表视图,我的解决方案是在双击子项时显示一个文本框。关键代码如下:

protected override void OnDoubleClick(EventArgs e)
{
        Point pt = this.PointToClient(Cursor.Position);
        ListViewItem curItem;
        int subItemIndex = GetSubItemAt(pt.X, pt.Y, out curItem);
        DoubleClickEventArgs args = new DoubleClickEventArgs(subItemIndex);
        base.OnDoubleClick(args);

        if (subItemIndex>=0 && !args.Cancel)
        {
            //StartEdit(...);
        }

}

public void EndEdit(bool acceptChanges)
    {
        //validation
        .................
        .................
        AfterSubItemEventArgs e = new AfterSubItemEventArgs(this.SelectedItems[0], m_editSubItemIndex, this.SelectedItems[0].SubItems[m_editSubItemIndex].Text, m_textbox.Text, false);
        OnAfterSubItemEdit(e);
        if (e.Cancel)
        {
            //....
        }
        else
        {
            //set new value
        }
        m_textbox.Visible = false;
        m_editSubItemIndex = -1;
    }

OnAfterSubItemEdit 是用户可以进行一些验证或其他操作的事件。我在这个方法中添加了一个检查,如果新值存在,我会先向用户显示一个消息框,然后隐藏文本框。但是现在问题来了,当我移动鼠标时,可以选择listview项目,我不知道如何解决这个问题,我尽力寻找方法,但失败了。所以,请帮助我!

4

2 回答 2

0

问题是您的表单仍然调用 DoubleClick 事件,无论该值是否存在。在代码中调用基本 DoubleClick 之前添加适当的条件,即:

if(!new value exists)
    base.OnDoubleClick(args);
于 2013-06-13T09:08:16.807 回答
0

Listview 有一个 LabelEdit 属性;当您将其设置为“true”时,您可以在事件处理程序中调用 Listview.Items[x].BeginEdit(),并编辑一个项目。例如,您可以处理 ListView.DoubleClick 事件并在此处调用 BeginEdit:

private void Form1_Load(object sender, System.EventArgs e)
 {
   listView1.LabelEdit = true;
  }

private void listView1_DoubleClick(object sender, System.EventArgs e)
{
  if(this.listView1.SelectedItems.Count==1)
     {
       this.listView1.SelectedItems[0].BeginEdit();
     }
 }
于 2013-06-13T06:19:02.287 回答