我试图在C#中实现一个类似文本框的Windows控件。当用户键入3个或更多字符时,将对数据源执行搜索。将返回多个字段(请参见下面的类结构作为一个可能的定义)。
public class MyStructure
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
    public string Value3 {get; set; }
}我的要求是显示一个包含多个列的自动完成列表(注意:这可以是一个字符串,其中包含来自连接在一起的列表中的填充字段)。当用户输入所有字符、按下箭头以选择项或按enter键时,textbox中的值将取列表的ValueMember (其中列表的DisplayMember将是整个数据源)。用户输入的不是向上或向下箭头或enter键的每一个击键都将执行另一个搜索并刷新列表。
我已经看到了如何在自动建议中实现带有单个列的textbox,但是无法找到一个相对简单的例子来说明如何对多个列这样做。控件应该是文本框还是组合框(如果可能的话)或者是用户控件的样式?
监视击键的事件是TextEntered事件还是KeyPress事件?我是否可以在不影响输入内容的情况下重置AutoCompleteStringCollection (在任何尝试中,我总是丢失我的输入或在输入中的位置)?
有人能提供如何在框架4.0或更高版本中这样做的示例吗?或者向我指出一个示例?
编辑1:经过大量搜索后,我发现本质上我需要在TextBox上实现一个ContextMenuStrip (用户控件下面的任何其他控件都将被重叠)。我的问题是,我无法确定如何处理按键事件,如Tab和Enter。此外,如果用户继续输入,我需要处理(在这种情况下,我希望将焦点切换回textbox并添加键)。下面是我的代码:
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        ContextMenuStrip menuStrip;
        string szMenuItem = string.Empty;
        // This would actually be a call to a web service
        List<MStarDeal> deals = DealInfo.Where(i => i.Value1.StartsWith(textBox1.Text.ToUpper()) || i.Value2.StartsWith(textBox1.Text.ToUpper()) || i.Value3.StartsWith(textBox1.Text.ToUpper()))
            .Select(i => i).ToList();
        if (textBox1.Text.Length >= 3 && !bSelected)
        {
            menuStrip = new System.Windows.Forms.ContextMenuStrip();
            foreach (MStarDeal item in deals)
            {
                szMenuItem = item.Value1.PadRight(15) + item.Value2.PadRight(20) + item.Value3.PadRight(80);
                ToolStripItem tsItem = new ToolStripMenuItem();
                tsItem.Text = szMenuItem;
                tsItem.Name = item.Value1;
                tsItem.MouseUp += tsItem_MouseUp;
                menuStrip.Items.Add(tsItem);
            }
            textBox1.ContextMenuStrip = menuStrip;
            textBox1.ContextMenuStrip.Show(textBox1, new Point(0, 20));
        }
        else if (bSelected)
        {
            bSelected = false;
        }
    }
    void tsItem_MouseUp(object sender, EventArgs e)
    {
        bSelected = true;
        textBox1.Text = ((ToolStripMenuItem)sender).Name;
    }谢谢,
李
发布于 2013-11-09 04:30:04
我想我明白你的问题了。如何使用TextChanged()事件而不是KeyPress?就列而言,如果将flowLayoutPanel设置为向正确的方向流动,并使其大小与两列的宽度相加,则它将呈现列。
https://stackoverflow.com/questions/19872320
复制相似问题