windowform combobox树形显示及tooltrip提示

      最近工作涉及到一些Window Form Combobox 下拉控件的使用,如怎么能使用我的下拉框有查询功能,查询出的来的数据集数据太多怎么能用树形的结构显示,让使用者看起来结构清晰,还想有象treeview控件一样鼠标停在某一项就可以显示某一项的文本提示等一些功能,这些功能看起来相对简单,有时候不知道怎么做的时候,也需要发一点时间在上面的,这一段时间实现了这些基本功能,总结下来以免以后忘记。

 第一、   控件的查询功能

1.  数据加载这里不能直接绑定数据库,只能一项一项的绑定到控件才能实现)

2.  数据的提取

DataTable projectTable = new DataTable();

projectTable = 根据SQL查询全部的数据信息

3.  要实现Combobox的查询功能首先在控件的KeyPress事件里处理一下输入的信息

        /// <summary>

        /// 根据下拉框输入的内容查询

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void combobox1_KeyPress(object sender, KeyPressEventArgs e)

        {

            string strFindStr = this.combobox1.Text.Trim();

 

            //展开下拉框

            combobox1.DroppedDown = true;

 

            if (e.KeyChar == (char)8)

            {

                if (combobox1.SelectionStart <= 1)

                {

                    combobox1.Text = "";

                    return;

                }

 

                if (combobox1.SelectionLength == 0)

                    strFindStr = combobox1.Text.Substring(0, combobox1.Text.Length - 1);

                else

                    strFindStr = combobox1.Text.Substring(0, combobox1.SelectionStart - 1);

            }

            else

            {

                if (cb.SelectionLength == 0)

                    strFindStr = combobox1.Text + e.KeyChar;

                else

                    strFindStr = combobox1.Text.Substring(0, combobox1.SelectionStart) + e.KeyChar;

            }

 

            //加载数据

            int count = LoadComboboxItemLayer(strFindStr);

 

            // 查询下拉列表中的数据项目如果有匹配,自动加匹配全部字符串.

            int intIdx = -1;

            intIdx = combobox1.FindString(strFindStr);

            if (intIdx != -1)

            {

                combobox1.SelectedText = "";

                if (count == 1)

                {

                    combobox1.SelectedIndex = intIdx;

                    combobox1.SelectionStart = strFindStr.Length;

                    combobox1.SelectionLength = combobox1.Text.Length;

                }

                else

                {

                    combobox1.SelectedIndex = 0;

                    combobox1.SelectionStart = strFindStr.Length;

                    combobox1.SelectionLength = combobox1.Text.Length;

                }

                e.Handled = true;

            }

            else

            {

                e.Handled = false;

            }

        }

 

        /// <summary>

        /// 根据输入内容加载数据

        /// </summary>

        /// <param name="queryStr">Combobox控件输入的内容</param>

        private int LoadComboboxItemLayer(string queryStr)

        {

            this.combobox1.Items.Clear();

 

            int result = 0;

 

            //加载数据

            if (projectTable!= null && projectTable.Rows.Count > 0)

            {

                string beforPorvince = string.Empty;

                DictionaryItem pLineItem;

                DataRow[] rows;

 

                DataRow[] projectDataRows = projectTable.Select(" pName like '%" + queryStr + "%' or cName like '%" + queryStr + "%' ", " pCode ");

                foreach (DataRow provinceRow in projectDataRows)

                {

                    if (beforPorvince != provinceRow["pCode"].ToString())

                    {

                       //添加树开结构的第一级信息

                        pLineItem = new DictionaryItem();

                        pLineItem.Code = provinceRow["pCode"].ToString();

                        pLineItem.Value = provinceRow["pName"].ToString();

                        cmbLine.Items.Add(pLineItem);

 

                        //根据第一级显示的父级查询的子级

                        rows = projectTable.Select("pCode = '" + provinceRow["pCode "].ToString() + "' and (pName like '%" + queryStr + "%' or cName like '%" + queryStr + "%')");

                        foreach (DataRow porjectRow in rows)

                        {

                            pLineItem = new DictionaryItem();

                            pLineItem.Code = provinceRow["cCode"].ToString();

                            pLineItem.Value = "  " + provinceRow["cName"].ToString();

                            cmbLine.Items.Add(pLineItem);

                            result++;

                        }

                    }

 

                    beforPorvince = provinceRow["pCode"].ToString();

                }

            }

            return result;

        }

 

第二、   Combobox 控件下拉的树形显示

  在第一部分中的代码已经实现的树开显示,不知道有木有注意到就是这一段代码

public class DictionaryItem

{

public string Code = "";

public string Value = "";

}

 

foreach (DataRow porjectRow in rows)

{

pLineItem = new DictionaryItem();

pLineItem.Code = provinceRow["cCode"].ToString();

pLineItem.Value = "  " + provinceRow["cName"].ToString();//这一部分

cmbLine.Items.Add(pLineItem);

result++;

}

         其实很简单,就是在添加控件的每一数据项时,在显示文本的时候前面加一段空字符串,就可以实现,简单吧,这一段代码是树中要显示的第二级的内容,还有第三级等,自己发挥,你明白的。取选择的每一项:

          DictionaryItem dicItem = 控件.SelectedItem as DictionaryItem;

          dicItem.Code 和 dicItem.Value 就可以得到你选择的值

 

第三、   Combobox控件下拉内容的Tooltip提示

      实现也比较简单,控件的一个属性的值和三个事件还有一个Tooltip控件,首先在Form里添加一个Tooltip控件,命名为toolTipCmblin,再把Combobox控件的属性DrawMode设置为OwnerDrawFixed,然后添加控件的三个事件:DrawItem,DropDown和DropDownClosed,代码如下:

/// <summary>

        /// 鼠标停在某一项目时提示显示全部的内容

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void combobox1_DrawItem(object sender, DrawItemEventArgs e)

        {

            string text = this.combobox1.GetItemText(combobox1.Items[e.Index]);

 

            e.DrawBackground();

            using (SolidBrush br = new SolidBrush(e.ForeColor))

            {

                e.Graphics.DrawString(text, e.Font, br, e.Bounds);

            }

 

            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)

            {

                this.toolTipCmblin.Show(text, combobox1, e.Bounds.Right, e.Bounds.Bottom);

            }

            else

            {

                this.toolTipCmblin.Hide(combobox1);

            }

 

            e.DrawFocusRectangle();

        }

 

        /// <summary>

        /// 启用下拉提示

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void combobox1_DropDown(object sender, EventArgs e)

        {

            this.toolTipCmblin.Active = true;

        }

 

        /// <summary>

        /// 关闭下拉提示

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void combobox1_DropDownClosed(object sender, EventArgs e)

        {

            this.toolTipCmblin.Active = false;

        }

         到些为止,大功告成!

转载于:https://www.cnblogs.com/blueterry/archive/2011/12/08/2280967.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tooltrip漂浮(在toolstrippanel和之外) 具体设计思想如下: 放置到ToolStripPanel上的,当工具栏浮动的时候,事实上是改变了其所在的容器对象,从其所在的ToolStripPanel移动到一个漂浮的容器上,因此要实现工具栏的浮动必须解决以下两个问题:     必须有一个浮动的容器来承载ToolStrip对象。     须知道ToolStrip对象何时改变其所在的容器,即在浮动的容器和主窗口上ToolStripPanel之间停靠。   对于第一个问题,我们的解决方案是动态的创建一个Form类作为浮动的容器,命名为ToolStripFloatWindow,该Form对象具有以下的属性:     FormBorderStyle = FixedToolWindow 边框样式     ShowInTaskbar = false 不在任务栏显示     ShowIcon = false 不显示窗口图标     TopMost = true 在所有窗口之上   为了解决第二个问题,我们查阅MSDN获知,当用鼠标拖拽ToolStrip对象释放鼠标时会触发其EndDrag事件。 我们在这个事件的处理方法中判断当ToolStrip对象的位置被移动到所在的ToolStripPanel之外的时候,创建ToolStripFloatWindow对象,并将ToolStrip对象移动到ToolStripFloatWindow上;要使ToolStrip对象恢复到原来的窗体上只要判断ToolStripFloatWindow对象的位置是否移动到了ToolStripPanel上, 当条件满足时将ToolStrip对象移动回ToolStripPanel中并销毁ToolStripFloatWindow对象。   此外,还要解决当ToolStrip对象放置到ToolStripFloatWindow对象上时, ToolStripFloatWindow对象必须与ToolStrip对象的尺寸一致。 还有ToolStripFloatWindow对象被点击了关闭按钮时不能将自己关闭。我们可以做两个类来实现上述的思路。 ToolStripFloatWindow类继承自Form类。 MyToolStrip 继承自ToolStrip类。增加了相应的属性和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值