• 如何让ComboBox的下拉列表宽度自适应内容的宽度


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

    如果能够让下拉列表的宽度随着内容的变化而变化,这个问题不就解决了。下面我们看看如何让ComboBox的下拉列表宽度自适应内容的宽度:
     1private void AdjustComboBoxDropDownListWidth(object comboBox)
     2{
     3    Graphics g = null;
     4    Font font = null;
     5    try
     6    {
     7        ComboBox senderComboBox = null;
     8        if (comboBox is ComboBox)
     9            senderComboBox = (ComboBox)comboBox;
    10        else if (comboBox is ToolStripComboBox)
    11            senderComboBox = ((ToolStripComboBox)comboBox).ComboBox;
    12        else
    13            return;
    14
    15        int width = senderComboBox.Width;
    16        g = senderComboBox.CreateGraphics();
    17        font = senderComboBox.Font;
    18
    19        //checks if a scrollbar will be displayed.
    20        //If yes, then get its width to adjust the size of the drop down list.
    21        int vertScrollBarWidth =
    22            (senderComboBox.Items.Count > senderComboBox.MaxDropDownItems)
    23            ? SystemInformation.VerticalScrollBarWidth : 0;
    24
    25        int newWidth;
    26        foreach (object s in senderComboBox.Items)  //Loop through list items and check size of each items.
    27        {
    28            if (s != null)
    29            {
    30                newWidth = (int)g.MeasureString(s.ToString().Trim(), font).Width
    31                    + vertScrollBarWidth;
    32                if (width < newWidth)
    33                    width = newWidth;   //set the width of the drop down list to the width of the largest item.
    34            }

    35        }

    36        senderComboBox.DropDownWidth = width;
    37    }

    38    catch
    39    { }
    40    finally
    41    {
    42        if (g != null)
    43            g.Dispose();
    44    }

    45}

    如果每次在我们向ComboBox中添加一项后,就要调用一下这个方法,那就太麻烦了。能不能把这种自适应宽度的功能集成到 ComboBox中呢?这里我们继承ComboBox,实现一个自定义的控件,在用户每次打开下拉列表的时候,让控件自动调整下拉列表的宽度。
     1using System;
     2using System.Collections.Generic;
     3using System.ComponentModel;
     4using System.Drawing;
     5using System.Data;
     6using System.Text;
     7using System.Windows.Forms;
     8
     9namespace WindowsApplication2
    10{
    11    class MyComboBox : ComboBox
    12    {
    13        protected override void OnDropDown(EventArgs e)
    14        {
    15            base.OnDropDown(e);
    16            AdjustComboBoxDropDownListWidth();  //调整comboBox的下拉列表的大小
    17        }

    18
    19        private void AdjustComboBoxDropDownListWidth()
    20        {
    21            Graphics g = null;
    22            Font font = null;
    23            try
    24            {
    25                int width = this.Width;
    26                g = this.CreateGraphics();
    27                font = this.Font;
    28
    29                //checks if a scrollbar will be displayed.
    30                //If yes, then get its width to adjust the size of the drop down list.
    31                int vertScrollBarWidth =
    32                    (this.Items.Count > this.MaxDropDownItems)
    33                    ? SystemInformation.VerticalScrollBarWidth : 0;
    34
    35                int newWidth;
    36                foreach (object s in this.Items)  //Loop through list items and check size of each items.
    37                {
    38                    if (s != null)
    39                    {
    40                        newWidth = (int)g.MeasureString(s.ToString().Trim(), font).Width
    41                            + vertScrollBarWidth;
    42                        if (width < newWidth)
    43                            width = newWidth;   //set the width of the drop down list to the width of the largest item.
    44                    }

    45                }

    46                this.DropDownWidth = width;
    47            }

    48            catch
    49            { }
    50            finally
    51            {
    52                if (g != null)
    53                    g.Dispose();
    54            }

    55        }

    56    }

    57}

  • 相关阅读:
    HTTP和SOAP完全就是两个不同的协议
    RabbitMQ七:交换机类型Exchange Types--Fanout 介绍
    日志级别简述
    RabbitMQ六:通过routingkey模拟日志
    http协议无状态中的 "状态" 到底指的是什么?!
    MySQL-时间(time、date、datetime、timestamp和year)
    API系列一:REST和RESTful认识
    Ref 和 Out 区别(演练代码)
    RabbitMQ五:生产者--队列--多消费者
    RabbitMQ四:生产者--队列--消费者
  • 原文地址:https://www.cnblogs.com/EthanCai/p/1237025.html
Copyright © 2020-2023  润新知