C #: Как вы редактируете элементы и подпункты в просмотре списка? - PullRequest
29 голосов
/ 23 января 2009

Как вы редактируете элементы и подпункты в просмотре списка? Допустим, у меня есть просмотр списка с 3 столбцами и подпунктами

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

Как бы я добавил подобные элементы в просмотр списка и как бы я отредактировал, скажем, имя машины, для которой когда-либо строка по индексу [], если мне нужно было редактировать во время выполнения при запуске события?

Ответы [ 5 ]

24 голосов
/ 18 ноября 2009

Если вы ищете «на месте» редактирование содержимого ListView (в частности, подэлементов ListView в режиме подробного просмотра), вам нужно будет реализовать это самостоятельно, или использовать третий - партийный контроль.

По умолчанию лучшее, что вы можете добиться с помощью "стандартного" ListView, - установить для его свойства LabelEdit значение true, чтобы пользователь мог редактировать текст первого столбца ListView (при условии, что разрешить редактирование текста в произвольном формате).

Некоторые примеры (включая полный исходный код) настроенных ListView, которые позволяют редактировать подпункты «на месте»:

C # Редактируемый ListView
Редактирование на месте подэлементов ListView

15 голосов
/ 28 февраля 2012

Я использую скрытое текстовое поле для редактирования всех элементов / подпунктов списка. Единственная проблема заключается в том, что текстовое поле должно исчезнуть, как только какое-либо событие происходит за пределами текстового поля, и просмотр списка не вызывает событие прокрутки, поэтому при прокрутке просмотра списка текстовое поле все равно будет видно. Чтобы обойти эту проблему, я создал событие прокрутки с этим переопределенным списком просмотра.

Вот мой код, я постоянно использую его, чтобы он мог кому-то помочь:

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 = "";
}
8 голосов
/ 09 февраля 2011

Нажмите элементы в списке. Добавьте кнопку, которая будет редактировать выбранные элементы. Добавить код

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{}
8 голосов
/ 30 июня 2010

Извините, у вас недостаточно представителей, или вы бы прокомментировали Ответ CraigTP .

Я нашел решение по 1-й ссылке - C # Editable ListView , довольно прост в использовании. Общая идея заключается в следующем:

  • идентифицирует SubItem, который был выбран, и накладывает TextBox на текст SubItem поверх SubItem
  • дайте это TextBox фокус
  • изменить SubItem текст на TextBox, когда TextBox теряет фокус

Какой обходной путь для, казалось бы, простой операции: - |

2 голосов
/ 30 января 2011
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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...