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您正在尝试从不同的线程将控件添加到父控件,控件只能从创建父控件的线程添加到父控件!
使用 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控件上的文本能不能居中显示?的主要内容,如果未能解决你的问题,请参考以下文章