源碼下載: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