Existe uma maneira fácil de criar duas colunas em uma janela de texto pop-up?
-
09-06-2019 - |
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();
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.