C#:如何在列表视图中编辑项目和子项目?

最后发布: 2009-01-23 04:10:52


问题

如何编辑列表视图中的项目和子项目? 假设我有一个包含3列和子项的列表视图,

Car Brand | Car Name | Car Year
Ford      | Mustang  | 2000
Dodge     | Charger  | 2007

我如何将这样的项目添加到listview中?如果我需要在运行时在触发事件时进行编辑,我将如何编辑让我们说一个按行[]排序的汽车名称?

c# listview
回答

如果您正在寻找ListView内容的“就地”编辑(特别是详细信息视图模式下ListView的子项),您需要自己实现,或使用第三方控件。

默认情况下,使用“标准” ListView可以实现的最佳效果是将其LabelEdit属性设置为true,以允许用户编辑ListView第一列的文本(假设您要允许自由格式文本编辑) 。

自定义ListView的一些示例(包括完整的源代码)允许对子项进行“就地”编辑:

C#可编辑ListView
就地编辑ListView子项


回答

我使用隐藏的文本框来编辑所有listview项目/子项目。 唯一的问题是文本框在文本框外发生任何事件时都需要消失,列表视图不会触发滚动事件,因此如果滚动列表视图,文本框仍然可见。 为了绕过这个问题,我用这个覆盖的列表视图创建了Scroll事件

这是我的代码,我不断重复使用它,这可能对某人有所帮助:

ListViewItem.ListViewSubItem SelectedLSI;
private void listView2_MouseUp(object sender, MouseEventArgs e)
{
    ListViewHitTestInfo i = listView2.HitTest(e.X, e.Y);
    SelectedLSI = i.SubItem;
    if (SelectedLSI == null)
        return;

    int border = 0;
    switch (listView2.BorderStyle)
    {
        case BorderStyle.FixedSingle:
            border = 1;
            break;
        case BorderStyle.Fixed3D:
            border = 2;
            break;
    }

    int CellWidth = SelectedLSI.Bounds.Width;
    int CellHeight = SelectedLSI.Bounds.Height;
    int CellLeft = border + listView2.Left + i.SubItem.Bounds.Left;
    int CellTop =listView2.Top + i.SubItem.Bounds.Top;
    // First Column
    if (i.SubItem == i.Item.SubItems[0])
        CellWidth = listView2.Columns[0].Width;

    TxtEdit.Location = new Point(CellLeft, CellTop);
    TxtEdit.Size = new Size(CellWidth, CellHeight);
    TxtEdit.Visible = true;
    TxtEdit.BringToFront();
    TxtEdit.Text = i.SubItem.Text;
    TxtEdit.Select();
    TxtEdit.SelectAll();
}
private void listView2_MouseDown(object sender, MouseEventArgs e)
{
    HideTextEditor();
}
private void listView2_Scroll(object sender, EventArgs e)
{
    HideTextEditor();
}
private void TxtEdit_Leave(object sender, EventArgs e)
{
    HideTextEditor();
}
private void TxtEdit_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
        HideTextEditor();
}
private void HideTextEditor()
{
    TxtEdit.Visible = false;
    if (SelectedLSI != null)
        SelectedLSI.Text = TxtEdit.Text;
    SelectedLSI = null;
    TxtEdit.Text = "";
}


回答

对不起,没有足够的代表,或者会对CraigTP的答案发表评论。

我从第一个链接 - C#Editable ListView找到了解决方案,非常容易使用。 一般的想法是:

  • 识别SubItem中选择了和覆盖一个TextBoxSubItem的文本在SubItem
  • 给这个TextBox焦点
  • TextBox失去焦点时,将SubItem的文本更改为TextBoxTextBox

什么解决方法看似简单的操作: - |


回答

单击列表视图中的项目。 添加一个按钮,用于编辑所选项目。 添加代码

try
{              
    LSTDEDUCTION.SelectedItems[0].SubItems[1].Text = txtcarName.Text;
    LSTDEDUCTION.SelectedItems[0].SubItems[0].Text = txtcarBrand.Text;
    LSTDEDUCTION.SelectedItems[0].SubItems[2].Text = txtCarName.Text;
}
catch{}


回答

private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    li = listView1.GetItemAt(e.X, e.Y);
    X = e.X;
    Y = e.Y;
}

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
    int nStart = X;
    int spos = 0;
    int epos = listView1.Columns[1].Width;
    for (int i = 0; i < listView1.Columns.Count; i++)
    {
        if (nStart > spos && nStart < epos)
        {
            subItemSelected = i;
            break;
        }

        spos = epos;
        epos += listView1.Columns[i].Width;
    }
    li.SubItems[subItemSelected].Text = "9";
}