C# 有没有一种简单的方法可以在弹出文本窗口中创建两列?
这似乎是一件容易的事。我只想弹出一个文本窗口,显示两列数据——左侧显示一个描述,右侧显示一个对应的值。我很少使用表单,所以我只抓取了第一个看起来合适的控件,一个文本框。我原以为使用制表符创建第二列是一种简单的方法,但我发现事情并没有那么顺利 我尝试这样做的方式似乎有两个问题(见下文)。首先,我在许多网站上读到,由于字体复杂,加上字距问题等等,MeasureString函数不是很精确。第二,我不知道TextBox控件下面使用的StringFormat是什么 不管怎么说,结果是我总是在右边的列中有一个选项卡关闭的项目。我想我可以滚动我自己的文本窗口,自己做所有的事情,但是天啊,有没有一个简单的方法来做到这一点C# 有没有一种简单的方法可以在弹出文本窗口中创建两列?,c#,winforms,controls,formatting,C#,Winforms,Controls,Formatting,这似乎是一件容易的事。我只想弹出一个文本窗口,显示两列数据——左侧显示一个描述,右侧显示一个对应的值。我很少使用表单,所以我只抓取了第一个看起来合适的控件,一个文本框。我原以为使用制表符创建第二列是一种简单的方法,但我发现事情并没有那么顺利 我尝试这样做的方式似乎有两个问题(见下文)。首先,我在许多网站上读到,由于字体复杂,加上字距问题等等,MeasureString函数不是很精确。第二,我不知道TextBox控件下面使用的StringFormat是什么 不管怎么说,结果是我总是在右边的列中有一
TextBox textBox = new TextBox();
textBox.Font = new Font("Calibri", 11);
textBox.Dock = DockStyle.Fill;
textBox.Multiline = true;
textBox.WordWrap = false;
textBox.ScrollBars = ScrollBars.Vertical;
Form form = new Form();
form.Text = "Recipe";
form.Size = new Size(400, 600);
form.FormBorderStyle = FormBorderStyle.Sizable;
form.StartPosition = FormStartPosition.CenterScreen;
form.Controls.Add(textBox);
Graphics g = form.CreateGraphics();
float targetWidth = 230;
foreach (PropertyInfo property in properties)
{
string text = String.Format("{0}:\t", Description);
while (g.MeasureString(text,textBox.Font).Width < targetWidth)
text += "\t";
textBox.AppendText(text + value.ToString() + "\n");
}
g.Dispose();
form.ShowDialog();
TextBox TextBox=new TextBox();
字体=新字体(“Calibri”,11);
textBox.Dock=DockStyle.Fill;
textBox.Multiline=true;
textBox.WordWrap=false;
textBox.ScrollBars=ScrollBars.Vertical;
表单=新表单();
form.Text=“配方”;
形式尺寸=新尺寸(400600);
form.FormBorderStyle=FormBorderStyle.sizeable;
form.StartPosition=FormStartPosition.CenterScreen;
表单.控件.添加(文本框);
Graphics g=form.CreateGraphics();
浮动目标宽度=230;
foreach(属性中的PropertyInfo属性)
{
string text=string.Format(“{0}:\t”,Description);
while(g.MeasureString(text,textBox.Font).Width
文本框不允许使用HTML吗?如果是这样,只需使用HTML将文本格式化为表格。否则,请尝试将文本添加到数据网格中,然后将其添加到表单中。如果需要,可以将此VB.Net代码翻译为C。这里的理论是更改控件中选项卡的大小
Private Declare Function SendMessage _
Lib "user32" Alias "SendMessageA" _
(ByVal handle As IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByRef lParam As Integer) As Integer
Private Sub SetTabStops(ByVal ctlTextBox As TextBox)
Const EM_SETTABSTOPS As Integer = &HCBS
Dim tabs() As Integer = {20, 40, 80}
SendMessage(ctlTextBox.Handle, EM_SETTABSTOPS, _
tabs.Length, tabs(0))
End Sub
我也为你把一个版本转换成了C。在VS2005中测试和工作
将此using语句添加到表单中:
using System.Runtime.InteropServices;
将其放在类声明之后:
private const int EM_SETTABSTOPS = 0x00CB;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, int[] lParam);
如果要设置tabstops,请调用此方法:
private void SetTabStops(TextBox ctlTextBox)
{
const int EM_SETTABSTOPS = 203;
int[] tabs = { 100, 40, 80 };
SendMessage(textBox1.Handle, EM_SETTABSTOPS, tabs.Length, tabs);
}
为了使用它,我所做的就是:
private void Form1_Load(object sender, EventArgs e)
{
SetTabStops(textBox1);
textBox1.Text = "Hi\tWorld";
}
如果你想要真正的表格,哈伦先生的答案是好的。DataGridView将为您提供非常Excel电子表格类型的外观
如果您只需要两列布局(类似于HTML的表格),那么请尝试TableLayoutPanel。它将为您提供所需的布局,使您能够在每个表格单元格中使用标准控件。我认为唯一的方法是执行与您正在执行的操作类似的操作,但使用固定字体并使用空格填充您自己的内容,这样您就不必担心选项卡扩展。谢谢Matt,您的解决方案对我非常有用。这是我的代码版本
// This is a better way to pass in what tab stops I want...
SetTabStops(textBox, new int[] { 12,120 });
// And the code for the SetTabsStops method itself...
private const uint EM_SETTABSTOPS = 0x00CB;
[DllImport("User32.dll")]
private static extern uint SendMessage(IntPtr hWnd, uint wMsg, int wParam, int[] lParam);
public static void SetTabStops(TextBox textBox, int[] tabs)
{
SendMessage(textBox.Handle, EM_SETTABSTOPS, tabs.Length, tabs);
}
更好的是,你让它更通用,这是完美的。我唯一的另一个建议是,如果将tabPos1-3作为参数组合到一个数组中,那么可以传递任意数量的参数,而不需要int[]制表符。。。不客气。祝你好运。是的,固定字体也可以解决这个问题,但是固定字体看起来很难看,所以这对我来说不是一个好的解决方案。哇,根据字体美学,提问者记下了这个问题!!