С#: Как вы редактируете элементы и подэлементы в списке?
Как вы редактируете элементы и подэлементы в списке? Скажем, у меня есть список с тремя столбцами и подпунктами
Автомобильная марка | Название автомобиля | Автомобильный год
Форд | Мустанг | 2000
Додж | Зарядное устройство | 2007
Как бы добавить элементы, подобные этому в listview, и как я могу отредактировать, пусть скажет название автомобиля, на котором всегда была строка по индексу [], если мне нужно было отредактировать во время выполнения при запуске события?
Ответы
Ответ 1
Если вы ищете "на месте" редактирование содержимого ListView
(в частности, подэлементы ListView в режиме просмотра подробностей), вам необходимо реализовать это самостоятельно или использовать сторонний элемент управления.
По умолчанию наилучшим достижением с помощью "стандартного" ListView
является присвоение ему свойства LabelEdit
true, чтобы позволить пользователю редактировать текст первого столбца ListView
(при условии, что вы хотите для редактирования текста в свободном формате).
Некоторые примеры (включая полный исходный код) настраиваемого ListView
, которые позволяют "на месте" редактировать подпозиции:
С# Редактируемый ListView
Редактирование подэлементов ListView на месте
Ответ 2
Я использую скрытое текстовое поле для редактирования всех элементов/подэлементов списка. Единственная проблема заключается в том, что текстовое поле должно исчезнуть, как только произойдет какое-либо событие вне текстового поля, и 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 = "";
}
Ответ 3
Извините, не хватает репутации или прокомментировал ответ CraigTP.
Я нашел решение из 1-й ссылки - С# Editable ListView, довольно прост в использовании. Общая идея заключается в следующем:
- идентифицировать
SubItem
, который был выбран, и наложить a TextBox
на текст SubItem
на SubItem
- выделите
TextBox
фокус
- измените текст
SubItem
на текст TextBox
, когда TextBox
потеряет фокус
Какое обходное решение для кажущейся простой операции: - |
Ответ 4
Выберите элементы в представлении списка.
Добавьте кнопку, которая будет редактировать выбранные элементы.
Добавьте код
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{}
Ответ 5
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";
}