c#动态设置combobox控件下拉项宽度以实现下拉项文字可以完全显示[转]

这个几乎是来自这里的啊:
http://blog.csdn.net/ccy3253/archive/2008/01/26/2067304.aspx

在winform编程中,combox是我们经常用到的控件,往往因为界面排版或者其它原因,comboBox的宽度受到限制,而下拉列表中的内容太长。如果按照combobox的默认设置 ,下拉列表和comboBox的宽度一样,并不会跟随内容的变化而变化,这就造成下拉列表中有些项的内容太长而不能全部显示出来.

如果能够让下拉列表的宽度随着内容的变化而变化,这个问题不就解决了。下面我们看看如何让comboxBox的下拉列表宽度自适应内容的宽度,方法AdjustComboBoxDropDownListWidth()用来调整comboBox宽度,但是如果每次在我们向comboBox中添加一项后,就要调用一下这个方法,那就太麻烦了。能不能把这种自适应宽度的功能集成到comboBox中呢?可以,这里我们继承ComboBox,实现一个自定义的控件,在用户每次打开下拉列表的时候,让控件自动调整下拉列表的宽度。


0.控件类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
  public partial class CtrlComboBox :ComboBox
  {
    protected override void OnDropDown(EventArgs e)
         {
            base.OnDropDown(e);
            AdjustComboBoxDropDownListWidth();  //调整comboBox的下拉列表的大小
        }

        private void AdjustComboBoxDropDownListWidth()
         {
            Graphics g = null;
            Font font = null;
            try
             {
                int width = this.Width;
                g = this.CreateGraphics();
                font = this.Font;

                //checks if a scrollbar will be displayed.
                //If yes, then get its width to adjust the size of the drop down list.
                int vertScrollBarWidth =
                    (this.Items.Count > this.MaxDropDownItems)
                    ? SystemInformation.VerticalScrollBarWidth : 0;

                int newWidth;
                foreach (object s in this.Items)  //Loop through list items and check size of each items.
                 {
                    if (s != null)
                     {
                        //newWidth = (int)g.MeasureString(s.ToString().Trim(), font).Width
                       newWidth = (int)g.MeasureString(((ComboBoxData)s).StrText, font).Width
                            + vertScrollBarWidth;
                        if (width < newWidth)
                            width = newWidth;   //set the width of the drop down list to the width of the largest item.
                    }
                }
                this.DropDownWidth = width;
            }
            catch
             { }
            finally
             {
                if (g != null)
                    g.Dispose();
            }
        }
  }
}




1.数据源类
public class ComboBoxData
  {
    private string _StrValue;
    private string _StrText;

    public ComboBoxData(string StrValue, String StrText)
    {
      _StrText = StrText;
      _StrValue = StrValue;

    }

    public string StrValue
    {
      get
      {
        return _StrValue;
      }
      set
      {
        _StrValue = value;
      }
    }

    public string StrText
    {
      get
      {
        return _StrText;
      }
      set
      {
        _StrText = value;
      }
    }


  }

2.form 里使用它。



ArrayList al = new ArrayList();
      for (int i = 0; i < 9; i++)
      {
        al.Add( new ComboBoxData("aaaaaaaaaaaaaaaaaaa" + i.ToString(), "aaaaaaaaaaaaaaaaaaa" + i.ToString()));
      }
      al.Add(new ComboBoxData("只要在我们向combox添加完所有项后,调用一下,就可以调整comboBox下拉列表的宽度了", "只要在我们向combox添

加完所有项后,调用一下,就可以调整comboBox下拉列表的宽度了"));
      ctrlComboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
      ctrlComboBox1.DisplayMember = "StrText";
      ctrlComboBox1.ValueMember = "StrValue";
      ctrlComboBox1.DataSource = al;



如果想实现在选择了某项后,combobox以提示的方式来查看选择项的完全text,那要加一个toolTip

 private void comboBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
      this.toolTip1.SetToolTip(this.comboBox1, this.comboBox1.Text);
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下步骤在C# WinForm动态绑定ComboBox下拉列表: 1. 在您的WinForm中添加一个ComboBox控件。 2. 在您的代码中,使用ADO.NET连接到您的数据库。 3. 编写一个SQL查询语句来检索您需要添加到ComboBox下拉列表中的数据。 4. 使用DataAdapter和DataSet对象来执行查询并将结果保存在一个DataTable对象中。 5. 使用ComboBox控件的DataSource属性将DataTable对象与ComboBox控件绑定。 6. 使用ComboBox控件的DisplayMember属性将您希望显示ComboBox下拉列表中的数据列的名称指定为字符串。 7. 使用ComboBox控件的ValueMember属性将您希望在选择ComboBox下拉列表中的目时返回的值的数据列的名称指定为字符串。 以下是一个示例代码,可以将ComboBox下拉列表动态绑定到数据库中的数据: ```csharp using System.Data.SqlClient; // 创建数据库连接 SqlConnection connection = new SqlConnection("Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"); // 创建SQL查询语句 string query = "SELECT ID, Name FROM MyTable"; // 创建DataAdapter和DataSet对象 SqlDataAdapter adapter = new SqlDataAdapter(query, connection); DataSet dataSet = new DataSet(); // 执行查询并将结果保存在DataTable对象中 adapter.Fill(dataSet, "MyTable"); // 将DataTable对象与ComboBox控件绑定 comboBox1.DataSource = dataSet.Tables["MyTable"]; // 指定ComboBox控件显示的数据列的名称 comboBox1.DisplayMember = "Name"; // 指定在选择ComboBox下拉列表中的目时返回的值的数据列的名称 comboBox1.ValueMember = "ID"; ``` 当您运行此代码时,ComboBox下拉列表将显示从数据库中检索到的所有目的名称,并且选择任何目时,ComboBox控件将返回该目的ID作为值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值