一个可编辑的。net多行列表框

概述 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

原文地址:https://www.cnblogs.com/Dincat/p/13431240.html