Frage

Dies schien wie eine einfache Sache zu tun.Ich wollte nur ein pop-up-text-Fenster und zeigt zwei Spalten an Daten-eine Beschreibung, die auf der linken Seite und einem entsprechenden Wert auf der rechten Seite angezeigt.Ich habe nicht gearbeitet, mit Formen, so viel ich nur, packte das erste Steuerelement, das schien angemessen, eine TextBox.Ich dachte, mit tabs, wäre ein einfacher Weg, um erstellen Sie die zweite Spalte, aber ich entdeckt Dinge funktionieren einfach nicht so gut.

Es scheint zwei Probleme mit der Art und Weise habe ich versucht, dies zu tun (siehe unten).Zuerst Las ich auf zahlreichen websites, die MeasureString-Funktion ist nicht sehr präzise durch wie komplexer Schriftarten, die mit kerning, Fragen und alle.Das zweite ist, dass ich keine Ahnung habe, was das TextBox-Steuerelement als Ihren StringFormat darunter.

Trotzdem, das Ergebnis ist, dass ich unweigerlich am Ende mit den Elementen in der rechten Spalte aus, indem Sie eine Registerkarte.Ich nehme an, ich könnte Rollen, meine eigene text-Fenster, und alles selber machen, aber gee, gibt es nicht einen einfachen Weg, dies zu tun?

    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();
War es hilfreich?

Lösung

Wenn Sie möchten, können Sie es übersetzen VB.Net code in C#.Die Theorie hier ist, dass Sie ändern Sie die Größe einer Registerkarte in der Steuerung.

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

Ich konvertierte eine version in C# für Sie, zu.Getestet und funktioniert in VS2005.

Fügen Sie diese using-Anweisung der form:

using System.Runtime.InteropServices;

Setzen Sie diese direkt nach der Deklaration der Klasse:

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

Rufen Sie diese Methode, wenn Sie möchten, legen Sie die Tabstopps:

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

Um es zu benutzen, hier ist alles, was ich Tat:

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

        textBox1.Text = "Hi\tWorld";
    }

Andere Tipps

Vielen Dank Matt Ihre Lösung funktionierte großartig für mich.Hier ist meine version Ihres Codes...

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

Wenn Sie wollen etwas wirklich tabellarische, HerrHaren ' s Antwort ist gut.Die DataGridView wird geben Sie eine sehr Excel-Kalkulationstabelle Art von look.

Wenn Sie nur eine zwei-Spalten-layout (ähnlich HTML-Tabelle), dann probieren Sie das TableLayoutPanel.Es ' ll geben Sie die layout Sie wünschen, mit der Möglichkeit, standard-Steuerelemente innerhalb jeder Zelle der Tabelle.

Ich glaube, der einzige Weg ist, etwas ähnliches zu tun, was Sie tun, aber verwenden Sie eine Feste schriftart und machen Sie Ihre eigene Polsterung mit Leerzeichen, so dass Sie nicht haben, um sorgen über die Registerkarte Erweiterung.

Nicht die Textfelder erlauben es HTML-Nutzung?Wenn das der Fall ist, verwenden Sie einfach HTML zu formatieren, den text in einer Tabelle.Ansonsten, versuchen Sie, hinzufügen von text zu einem datagrid, und klicken Sie dann hinzufügen, dass auf die form.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top