C# WinForm控制項ListBox點選可編輯(附源碼)

來源:互聯網
上載者:User
源碼下載:http://dotnet.5d6d.com/thread-471-1-1.html
正常情況下,.Net內建的ListBox是無法進行編輯的,欲讓它可編輯,我們可添加一個隱藏的文本編輯框,當雙擊項的時候顯示編輯框,更新項內容後隱藏編輯框即可。
欲調整ListBox每個項的高度,ListBox有一個內建屬性ItemHeight,於是我們很自然的就設這個屬性值,結果卻發現改不動,改後又返回預設值12,後面才發現要使該屬性值有效更改,必須將DrawMode屬性設為OwnerDrawFixed,並且為ListBox添加DrawItem事件:private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
}經過這樣的控制後,設計介面中的ListBox項看不到了,但沒關係,啟動並執行時候是可見的,而且每個項的高度確實作了有效更改。
接下來我們為ListBox再添幾個事件來控制編輯框的顯示,其實就兩個:DoubleClick和MouseClick。好了,在添加之前我們在全域區定義一個編輯框txtEdit,並在建構函式為其添加KeyDown事件:
全部代碼如下:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EditListBox
{
    public partial class Form1 : Form
    {
        TextBox txtEdit = new TextBox();
        /// <summary>
        /// KeyDown事件定義
        /// </summary>
        private void txtEdit_KeyDown(object sender, KeyEventArgs e)
        {
            //Enter鍵 更新項並隱藏編輯框
            if (e.KeyCode == Keys.Enter)
            {
                listBox1.Items[listBox1.SelectedIndex] = txtEdit.Text;
                txtEdit.Visible = false;
            }
            //Esc鍵 直接隱藏編輯框
            if (e.KeyCode == Keys.Escape)
                txtEdit.Visible = false;
        }
        public Form1()
        {
            InitializeComponent();
            txtEdit.KeyDown += new KeyEventHandler(txtEdit_KeyDown);
            SetListBox();
            BindListBox();
        }
        //設定ListBox,高度為20
        private void SetListBox()
        {
            listBox1.DrawMode = DrawMode.OwnerDrawFixed;
            listBox1.ItemHeight = 20;
        }
        //綁定ListBox
        private void BindListBox()
        {
            ListItem li = new ListItem("0", "選項一");
            listBox1.Items.Add(li);
            li = new ListItem("1", "選項二");
            listBox1.Items.Add(li);
            li = new ListItem("2", "選項三");
            listBox1.Items.Add(li);
        }
        /// <summary>
        /// 選擇項類,用於ComboBox或者ListBox添加項
        /// </summary>
        public class ListItem
        {
            private string id = string.Empty;
            private string name = string.Empty;
            public ListItem(string sid, string sname)
            {
                id = sid;
                name = sname;
            }
            public override string ToString()
            {
                return this.name;
            }
            public string ID
            {
                get
                {
                    return this.id;
                }
                set
                {
                    this.id = value;
                }
            }
            public string Name
            {
                get
                {
                    return this.name;
                }
                set
                {
                    this.name = value;
                }
            }
        }

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.DrawFocusRectangle();
            e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
        }

        private void listBox1_MouseClick(object sender, MouseEventArgs e)
        {
            txtEdit.Visible = false;
        }

        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            int itemSelected = listBox1.SelectedIndex;
            string itemText = listBox1.Items[itemSelected].ToString();

            Rectangle rect = listBox1.GetItemRectangle(itemSelected);
            txtEdit.Parent = listBox1;
            txtEdit.Bounds = rect;
            txtEdit.Multiline = true;
            txtEdit.Visible = true;
            txtEdit.Text = itemText;
            txtEdit.Focus();
            txtEdit.SelectAll();
        }
    }
}

經過這樣的處理後,我們看看最終的效果:

源碼下載:http://dotnet.5d6d.com/thread-471-1-1.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.