web-dev-qa-db-ja.com

C#:リストビューでアイテムとサブアイテムを編集するにはどうすればよいですか?

リストビューでアイテムとサブアイテムを編集するにはどうすればよいですか? 3つの列とサブアイテムを持つリストビューがあるとします。

自動車ブランド|車名|カーイヤー
フォード|マスタング| 2000 
ダッジ|充電器| 2007 

リストビューにそのようなアイテムを追加するにはどうすればよいですか?イベントの実行時に実行時に編集する必要がある場合、どのように編集しますか?

29
Ted Paulson

ListViewのコンテンツ(具体的には詳細ビューモードのListViewのサブアイテム)の「インプレース」編集を探している場合、これを自分で実装するか、サードパーティのコントロールを使用する必要があります。 。

デフォルトでは、「標準」ListViewで達成できる最善の方法は、LabelEditプロパティをtrueに設定して、ユーザーがListView(自由形式のテキスト編集を許可すると仮定します)。

サブアイテムの「インプレース」編集を可能にするカスタマイズされたListViewのいくつかの例(完全なソースコードを含む)は次のとおりです。

C#編集可能なリストビュー
ListViewサブアイテムのインプレース編集

24
CraigTP

非表示のテキストボックスを使用して、すべてのリストビューアイテム/サブアイテムを編集します。唯一の問題は、テキストボックスの外側でイベントが発生するとすぐにテキストボックスを非表示にする必要があり、リストビューがスクロールイベントをトリガーしないため、リストビューをスクロールしてもテキストボックスが表示されることです。この問題を回避するために、スクロールイベントを作成しました オーバーライドされたリストビュー

ここに私のコードがあります、私は常にそれを再利用するので、誰かの助けになるかもしれません:

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 = "";
}
16
Nemesis

申し訳ありませんが、十分な担当者がいないか、または CraigTPの回答 についてコメントしていたはずです。

私は最初のリンクから解決策を見つけました- C#Editable ListView 、非常に使いやすいです。一般的な考え方は次のとおりです。

  • 選択されたSubItemを識別し、TextBoxSubItemのテキストでSubItemの上にオーバーレイします
  • これにTextBoxフォーカスを与える
  • SubItemがフォーカスを失ったときに、TextBoxのテキストをTextBoxのテキストに変更する

What一見単純な操作の回避策:-|

8
lazo

リストビューでアイテムをクリックします。選択したアイテムを編集するボタンを追加します。コードを追加する

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
Ryan
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";
}
2
ahmad