por función funciones formularios form controles control comunes c# winforms controls formatting

función - funciones en c# windows forms



¿Hay una manera fácil de crear dos columnas en una ventana de texto emergente? (5)

Esto parecía una cosa fácil de hacer. Solo quería abrir una ventana de texto y mostrar dos columnas de datos: una descripción en el lado izquierdo y un valor correspondiente en el lado derecho. No he trabajado mucho con Forms, así que acabo de obtener el primer control que me pareció apropiado, un TextBox. Pensé que usar pestañas sería una manera fácil de crear la segunda columna, pero descubrí que las cosas simplemente no funcionan tan bien.

Parece haber dos problemas con la forma en que traté de hacer esto (ver más abajo). Primero, leí en numerosos sitios web que la función MeasureString no es muy precisa debido a la complejidad de las fuentes, a los problemas de interletraje y a todo. El segundo es que no tengo idea de qué está usando el control TextBox como StringFormat debajo.

De todos modos, el resultado es que invariablemente termino con elementos en la columna de la derecha que están apagados por una pestaña. Supongo que podría rodar mi ventana de texto y hacer todo yo mismo, pero ¿no hay una forma sencilla de hacer esto?

¡Gracias por cualquier ayuda!

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();


¿Los cuadros de texto no permiten el uso de HTML? Si ese es el caso, solo use HTML para formatear el texto en una tabla. De lo contrario, intente agregar el texto a una cuadrícula de datos y luego agregar eso al formulario.


Creo que la única forma es hacer algo similar a lo que está haciendo, pero use una fuente fija y haga su propio relleno con espacios para que no tenga que preocuparse por la expansión de las pestañas.


Gracias Matt, tu solución funcionó muy bien para mí. Aquí está mi versión de tu código ...

// 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); }


Si lo desea, puede traducir este código de VB.Net a C #. La teoría aquí es que cambias el tamaño de una pestaña en el control.

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

También convertí una versión a C # para ti. Probado y trabajando en VS2005.

Agregue esta declaración using a su formulario:

using System.Runtime.InteropServices;

Pon esto justo después de la declaración de clase:

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);

Llame a este método cuando desee configurar las pestañas:

private void SetTabStops(TextBox ctlTextBox) { const int EM_SETTABSTOPS = 203; int[] tabs = { 100, 40, 80 }; SendMessage(textBox1.Handle, EM_SETTABSTOPS, tabs.Length, tabs); }

Para usarlo, aquí está todo lo que hice:

private void Form1_Load(object sender, EventArgs e) { SetTabStops(textBox1); textBox1.Text = "Hi/tWorld"; }


Si quiere algo verdaderamente tabular, la respuesta del Sr. Haren es buena. El DataGridView le dará un aspecto de hoja de cálculo muy Excel.

Si solo desea un diseño de dos columnas (similar a la tabla de HTML), pruebe el TableLayoutPanel. Te dará el diseño que deseas con la capacidad de usar controles estándar dentro de cada celda de la tabla.