概述 MultiLineListBox是一个完全由所有者绘制的ListBox派生类 多行项目以及就地编辑项目。它被包裹起来了 易于部署的类库。你不需要做任何特别的事情 当使用它。就像使用普通的列表框一样使用它。当你添加 对于一行来说太长了的字符串,MultiLineListBox 将长字符串包装成多行。编辑条目也很容易。只是点击右键 在任何项目或按F2键时,项目被选中,这将重叠 恰好位于所选或单击项目上方的编辑框。你可以把你的 更改后,您可以按回车键,也可以单击其中的任何其他位置 要使修改生效的列表框。如果您想取消更改 只需按Escape键就可以返回原始文本。 该类不允许将项设为空,并将弹出一条消息 框警告,不会让你的注意力从项目转移,直到你做了 按转义键取消修改,或者您已经输入了一些文本。 如果在项目编辑文本框中输入大量文本,则叠加文本框 它可以让你垂直滚动。 使用类 只需将该控件添加到工具箱。现在就像你自己一样使用它吧。将 使用常规的列表框。尝试输入长字符串。并运行程序。试一试 编辑字符串按F2键或右键点击 项。查看尝试修改项时如何弹出警告消息框 字符串到一个空字符串。我添加这个特性是因为我将在项目中 如果使用这个,null字符串是被严格禁止的。也许你想这么做 允许空字符串,如果允许,请随意注释掉属性中的相关代码 源代码。 技术细节 显然,DrawMode被设置为DrawMode。ownerdrawvariable。我们需要 计算每件物品所需的高度。我们就是这样做的 OnMeasureItem覆盖, 隐藏,复制Code
//... string s = Items[e.Index].ToString(); SizeF sf = e.Graphics.MeasureString(s,Font,Width); int htex = (e.Index==0) ? 15 : 10; e.ItemHeight = (int)sf.Height + htex; e.ItemWidth = Width; //...
现在我们需要画出文本,因为这是一个所有者绘制的列表框。我们 如下所示重写OnDrawItem。 隐藏,收缩,复制Code
protected override void OnDrawItem(DrawItemEventArgs e) { //... /*chk if list box has any items*/ if(e.Index > -1) { string s = Items[e.Index].ToString(); /*Normal items*/ if((e.State & DrawItemState.Focus)==0) { e.Graphics.FillRectangle( new SolidBrush(SystemColors.Window), e.Bounds); e.Graphics.DrawString(s,Font, new SolidBrush(SystemColors.WindowText), e.Bounds); e.Graphics.DrawRectangle( new Pen(SystemColors.Highlight),e.Bounds); } else /*Selected item, needs highlighting*/ { e.Graphics.FillRectangle( new SolidBrush(SystemColors.Highlight), e.Bounds); e.Graphics.DrawString(s,Font, new SolidBrush(SystemColors.HighlightText), e.Bounds); } } }
到目前为止还不错。对于就地编辑,我们要做的是推导a 类,并将其添加到列表框中。我们处理 方法来检查用户是否右键单击了一个项目。 隐藏,复制Code
protected override void OnMouseUp( System.Windows.Forms.MouseEventArgs e) { //... /* Is it a right mouse clk? */ if(e.Button == MouseButtons.Right) { string s = Items[index].ToString(); Rectangle rect = GetItemRectangle(index); //overlay the text box right over //the list box item to be edited tbox.Location = new Point(rect.X,rect.Y); tbox.Size = new Size(rect.Width,rect.Height); tbox.Text = s; tbox.index = index; tbox.SelectAll(); tbox.Show(); tbox.Focus(); } //... }
类似地,我们处理OnKeyDown来检查用户是否 按了F2键。 隐藏,复制Code
protected override void OnKeyDown(KeyEventArgs e) { if(e.KeyData == Keys.F2) { //... string s = Items[index].ToString(); Rectangle rect = GetItemRectangle(index); tbox.Location = new Point(rect.X,rect.Y); tbox.Size = new Size(rect.Width,rect.Height); //... } //... }
在TextBox派生类中,我们覆盖了OnLostFocus 和OnKeyPress(检查为Enter键),并作出检查,以确保 用户不会输入空字符串。的源代码可以检查 更细致的细节,但基本上这就是这个类所做的,这个类是 MultiLineListBox类的私有内部类。我还要检查 在OnKeyPress处理程序中的Escape键,以允许用户 取消修改。 结论 我希望得到你的反馈——好的和坏的。我也想知道 是否有人真的认为它在应用程序中足够有用。或 这个类是否可以以任何特定的方式进行改进。至于我自己 一整天都在处理我遇到的各种各样的问题,大部分都是到期的 我的自定义控制编码经验不足,而不是由于有任何大的困难 在我的尝试中。 本文转载于:http://www.diyabc.com/frontweb/news235.html