Pergunta

Isso parecia uma coisa fácil de fazer.Eu só queria abrir uma janela de texto e exibir duas colunas de dados – uma descrição no lado esquerdo e um valor correspondente exibido no lado direito.Não trabalhei muito com Forms, então peguei o primeiro controle que me pareceu apropriado, um TextBox.Achei que usar guias seria uma maneira fácil de criar a segunda coluna, mas descobri que as coisas simplesmente não funcionam tão bem.

Parece haver dois problemas com a maneira como tentei fazer isso (veja abaixo).Primeiro, li em vários sites que a função MeasureString não é muito precisa devido à complexidade das fontes, com problemas de kerning e tudo.A segunda é que não tenho ideia do que o controle TextBox está usando como StringFormat abaixo.

De qualquer forma, o resultado é que invariavelmente acabo com itens na coluna da direita que estão desativados por uma guia.Suponho que eu poderia abrir minha própria janela de texto e fazer tudo sozinho, mas, caramba, não existe uma maneira simples de fazer isso?

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

Solução

Se desejar, você pode traduzir esse código VB.Net para C#.A teoria aqui é que você altera o tamanho de uma guia no controle.

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

Converti uma versão para C# para você também.Testado e funcionando no VS2005.

Adicione esta instrução using ao seu formulário:

using System.Runtime.InteropServices;

Coloque isso logo após a declaração da classe:

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

Chame esse método quando quiser definir as tabulações:

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

Para usá-lo, aqui está tudo o que fiz:

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

        textBox1.Text = "Hi\tWorld";
    }

Outras dicas

Obrigado Matt, sua solução funcionou muito bem para mim.Aqui está minha versão do seu 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);
}

Se você quer algo verdadeiramente tabular, Sr.A resposta de Haren é boa.O DataGridView lhe dará uma aparência de planilha do Excel.

Se você deseja apenas um layout de duas colunas (semelhante à tabela HTML), experimente o TableLayoutPanel.Ele lhe dará o layout desejado com a capacidade de usar controles padrão em cada célula da tabela.

Acredito que a única maneira é fazer algo parecido com o que você está fazendo, mas use uma fonte fixa e faça seu próprio preenchimento com espaços para não precisar se preocupar com a expansão das abas.

As caixas de texto não permitem o uso de HTML?Se for esse o caso, basta usar HTML para formatar o texto em uma tabela.Caso contrário, tente adicionar o texto a um datagrid e depois adicioná-lo ao formulário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top