Domanda

Sembrava una cosa facile da fare.Volevo solo la comparsa di una finestra di testo e visualizzazione a due colonne di dati-e una descrizione sul lato sinistro e un corrispondente valore visualizzato sul lato destro.Non ho lavorato con Forme molto così ho appena preso il primo controllo che sembrava appropriato, una casella di testo.Ho pensato che l'uso di schede sarebbe un modo semplice per creare la seconda colonna, ma ho scoperto che le cose non funzionano bene.

Sembra che ci siano due problemi con il modo in cui ho provato a fare questo (vedi sotto).Primo, ho letto su diversi siti che la MeasureString funzione non è molto preciso, a causa delle complesse tipi di carattere, con la crenatura problemi di tutti e di ciascuno.La seconda è che non ho idea di cosa sia il controllo TextBox utilizza come StringFormat sotto.

Comunque, il risultato è che ho sempre finire con articoli nella colonna di destra che vengono fuori da una scheda.Suppongo che potrei tirare la mia finestra di testo e fare tutto a me stesso, ma accidenti, non c'è un modo semplice per fare questo?

    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();
È stato utile?

Soluzione

Se si desidera, è possibile tradurre questo VB.Net codice C#.Qui la teoria è che è possibile modificare le dimensioni di una scheda di controllo.

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

Ho convertito una versione in C#, per voi, troppo.Testato e funzionante in VS2005.

Aggiungere questa istruzione per il modulo:

using System.Runtime.InteropServices;

Mettere subito dopo la dichiarazione della 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);

Chiamare questo metodo quando si desidera impostare le tabulazioni:

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

Per usarlo, qui c'è tutto quello che ho fatto:

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

        textBox1.Text = "Hi\tWorld";
    }

Altri suggerimenti

Grazie Matt, la tua soluzione ha funzionato grande per me.Ecco la mia versione del tuo codice...

// 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 si vuole qualcosa di veramente tabellare, il SignorHaren la risposta è buona.Il DataGridView vi darà un foglio di calcolo di Excel tipo di look.

Se si desidera solo un layout a due colonne (simile a HTML della tabella), poi provare il TableLayoutPanel.Questo ti dà il layout che hai il desiderio, con la possibilità di utilizzare i normali controlli all'interno di ogni cella della tabella.

Credo che l'unico modo è quello di fare qualcosa di simile a quello che si sta facendo, ma utilizzare un tipo di carattere fisso e fare il vostro proprio imbottitura con spazi, in modo che non devi preoccuparti di scheda di espansione.

Non le caselle di testo consentono HTML utilizzo?Se questo è il caso, è sufficiente utilizzare il codice HTML per formattare il testo in una tabella.In caso contrario, provare ad aggiungere del testo a una datagrid e quindi aggiungendo che di forma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top