C# ComboBox控件上的文本能不能居中显示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# ComboBox控件上的文本能不能居中显示?相关的知识,希望对你有一定的参考价值。

如题
数据是数据库中的。因窗体整体效果,ComboBox控件大小为80,20,选项文本只有两、三个字,靠在控件左方不太美观。

可以居中显示。实现方法为

    将ComboBox.DrawMode设置为DrawMode.OwnerDrawFixed,

    对ComboBox的DrawItem事件编程,各个项目居中显示。


具体步骤如下:

(1)在Visual Studio中创建一个“Windows 窗体应用程序”项目。在Form1上布置一个ComboBox控件

(2)Form1窗体代码Form1.cs

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
            // 允许代码重新绘制,固定大小
            comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
            string[] items = 
                                 "项目", 
                                 "项目 1", 
                                 "项目 10", 
                                 "项目 100", 
                                 "项目 1000", 
                                 "项目 10000" 
                             ;
            comboBox1.Items.AddRange(items);
        

        // 将comboBox1中的项目居中显示!
        private void comboBox1_DrawItem(object sender, 
            DrawItemEventArgs e)
        
            string s = this.comboBox1.Items[e.Index].ToString();
            // 计算字符串尺寸(以像素为单位)
            SizeF ss = e.Graphics.MeasureString(s, e.Font);
            // 水平居中
            float left = (float)(e.Bounds.Width - ss.Width) / 2;
            if (left < 0) left = 0f;
            float top = (float)(e.Bounds.Height - ss.Height) / 2;
            // 垂直居中
            if (top < 0) top = 0f;
            top = top + this.comboBox1.ItemHeight * e.Index;
            // 输出
            e.DrawBackground();
            e.DrawFocusRectangle();
            e.Graphics.DrawString(
                s, 
                e.Font, 
                new SolidBrush(e.ForeColor), 
                left, top);
        
    

(3)运行效果

参考技术A 虽然微软封装的控件不直接支持此功能。
但是你可以在调整窗口大小 的resize事件中使用代码来调整控件的大小和位置呀。
参考技术B 不能
微软封装的这个控件不支持的。
你可以自己写一个控件,添加上你需要的一些的功能。本回答被提问者采纳
参考技术C 如果数据不是动态的,加空格 参考技术D 貌似不能的

在一个线程上创建的 C# 控件不能作为另一个线程上的控件的父级

【中文标题】在一个线程上创建的 C# 控件不能作为另一个线程上的控件的父级【英文标题】:C# Controls created on one thread cannot be parented to a control on a different thread 【发布时间】:2013-01-22 22:30:55 【问题描述】:

我正在运行一个线程,该线程获取信息并创建标签并显示它,这是我的代码

    private void RUN()
    
        Label l = new Label();
        l.Location = new Point(12, 10);
        l.Text = "Some Text";
        this.Controls.Add(l);
    

    private void button1_Click(object sender, EventArgs e)
    
        Thread t = new Thread(new ThreadStart(RUN));
        t.Start();
    

有趣的是,我以前有一个带有面板的应用程序,我过去常常使用线程向它添加控件而没有任何问题,但这个不会让我这样做。

【问题讨论】:

您只能从 UI 线程修改 UI 元素。 将业务内容(信息抓取)与 UI(创建标签)分开。 为什么要创建线程只是为了添加 UI 元素? Creating controls in a non-UI thread 的可能重复项 【参考方案1】:

您不能从另一个线程更新 UI 线程:

 private void RUN()
        
            if (this.InvokeRequired)
            
                this.BeginInvoke((MethodInvoker)delegate()
                
                    Label l = new Label(); l.Location = new Point(12, 10);
                    l.Text = "Some Text";
                    this.Controls.Add(l);
                );
            
            else
            
                Label l = new Label();
                l.Location = new Point(12, 10);
                l.Text = "Some Text";
                this.Controls.Add(l);
            
        

【讨论】:

【参考方案2】:

您需要使用 BeginInvoke 从另一个线程安全地访问 UI 线程:

    Label l = new Label();
    l.Location = new Point(12, 10);
    l.Text = "Some Text";
    this.BeginInvoke((Action)(() =>
    
        //perform on the UI thread
        this.Controls.Add(l);
    ));

【讨论】:

无法使用错误 1:使用泛型类型 'System.Action' 需要 1 个类型参数【参考方案3】:

您正在尝试从不同的线程将控件添加到父控件,控件只能从创建父控件的线程添加到父控件!

使用 Invoke 从另一个线程安全地访问 UI 线程:

    Label l = new Label();
    l.Location = new Point(12, 10);
    l.Text = "Some Text";
    this.Invoke((MethodInvoker)delegate
    
        //perform on the UI thread
        this.Controls.Add(l);
    );

【讨论】:

以上是关于C# ComboBox控件上的文本能不能居中显示?的主要内容,如果未能解决你的问题,请参考以下文章

C#中关于combobox控件问题

C# 窗体,里多个控件布局相对居中

C#中Windows窗体工具栏

vb combobox控件 如何选择其中一项使一些文本框不能用,选令一项之前不能用的,变成能用

c# 中怎么调整textbox的文本格式,垂直居中

C# winform 编程 自定义combobx控件,将treeview控件嵌入combobox中