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

时间:2009-01-23 04:10:52

标签: c# listview

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

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

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

5 个答案:

答案 0 :(得分:24)

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

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

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

C# Editable ListView
In-place editing of ListView subitems

答案 1 :(得分:15)

我使用隐藏文本框编辑所有listview项目/子项目。唯一的问题是文本框在文本框外发生任何事件时都需要消失,列表视图不会触发滚动事件,因此如果滚动列表视图,文本框仍然可见。 为了绕过这个问题,我用这个overrided 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 = "";
}

答案 2 :(得分:8)

抱歉,没有足够的代表,或者会对CraigTP's answer发表评论。

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

  • 标识所选的SubItem,并将TextBoxSubItem的文字重叠在SubItem
  • 给予此TextBox焦点
  • SubItem失去焦点时,将TextBox的文字更改为TextBox的文字

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

答案 3 :(得分:8)

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

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{}

答案 4 :(得分:2)

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";
}