Pregunta

Esto parecía una cosa fácil de hacer.Yo sólo quería abrirá una ventana de texto y visualización de dos columnas de datos -- una descripción en el lado izquierdo y un valor correspondiente se muestra en el lado derecho.No he trabajado con Formas mucho así que me agarró el primer control que parecía apropiado, un cuadro de texto.Pensé en pestañas, sería una manera fácil de crear la segunda columna, pero he descubierto que las cosas simplemente no funcionan tan bien.

Parece ser que hay dos problemas con la manera en que traté de hacer esto (ver más abajo).En primer lugar, he leído en numerosos sitios web que el MeasureString función no es muy precisa debido a lo complejo que son las fuentes, con el kerning y todos.La segunda es que no tengo idea de lo que el control de cuadro de texto está usando como su StringFormat debajo.

De todos modos, el resultado es que me terminan invariablemente con los elementos de la columna de la derecha que están fuera una ficha.Supongo que me podría rodar mi propia ventana de texto y hacer todo por mí mismo, pero oye, ¿no hay una manera simple de hacer esto?

    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();
¿Fue útil?

Solución

Si usted desea, usted puede traducir este VB.Net código para C#.La teoría aquí es que puedes cambiar el tamaño de una ficha 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

He convertido una versión de C# para usted, también.Probado y de trabajo en VS2005.

Agregar esta instrucción de uso a su forma:

using System.Runtime.InteropServices;

Poner esto justo después de la declaración de la 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);

Llamar a este método cuando desee establecer el tabstops:

    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í es todo lo que hice:

    private void Form1_Load(object sender, EventArgs e)
    {
        SetTabStops(textBox1);

        textBox1.Text = "Hi\tWorld";
    }

Otros consejos

Gracias Matt, su solución funcionó muy bien para mí.Aquí está mi versión de el 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 quieres algo realmente tabular, el Sr.Haren la respuesta es buena.El DataGridView le dará una hoja de cálculo de Excel tipo de look.

Si lo que desea es una de dos diseño de la columna (similar al HTML de la tabla), a continuación, probar el TableLayoutPanel.Te proporcionará el diseño que usted desea con la capacidad para utilizar los controles estándar dentro de cada celda de la tabla.

Creo que la única manera es hacer algo similar a lo que está haciendo, pero el uso de una fuente fija y hacer su propio relleno con espacios para que usted no tiene que preocuparse acerca de la ficha de expansión.

No el texto en los cuadros de HTML de uso?Si ese es el caso, sólo tiene que utilizar HTML para dar formato al texto en una tabla.De lo contrario, trate de añadir el texto a un datagrid y añadiendo a continuación el formulario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top