如何在列表视图中编辑项目和子项目?假设我有一个包含3列和子项的列表视图,
Car Brand | Car Name | Car Year Ford | Mustang | 2000 Dodge | Charger | 2007
我如何将这样的项目添加到listview中?如果我需要在运行时在触发事件时进行编辑,我将如何编辑让我们说按索引[]的行名称?
答案 0 :(得分:24)
如果您正在寻找ListView
内容的“就地”编辑(特别是详细信息视图模式中ListView的子项),您需要自己实现,或使用第三方控制。
默认情况下,使用“标准”ListView
可以达到的最佳效果是将其LabelEdit
属性设置为true,以允许用户编辑{{1}的第一列的文本(假设你想允许自由格式的文本编辑)。
允许对子项进行“就地”编辑的自定义ListView
的一些示例(包括完整源代码):
答案 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
,并将TextBox
与SubItem
的文字重叠在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";
}