هل هناك طريقة سهلة لإنشاء عمودين في منبثقة النص النافذة ؟

StackOverflow https://stackoverflow.com/questions/72198

سؤال

هذا يبدو وكأنه شيء من السهل القيام به.أردت فقط أن يطفو على السطح نافذة النص و عرض عمودين من البيانات -- وصف على الجانب الأيسر و القيمة المقابلة عرضها على الجانب الأيمن.لم أعمل مع أشكال كثيرا لقد أخذت أول التحكم التي تبدو مناسبة في مربع نص.فكرت باستخدام علامات تكون طريقة سهلة لإنشاء العمود الثاني ، ولكن اكتشفت أشياء فقط لا تعمل جيدا.

يبدو أن هناك مشكلتين مع الطريقة حاولت أن تفعل هذا (انظر أدناه).أولا, لقد قرأت في العديد من المواقع أن MeasureString وظيفة ليست دقيقة جدا بسبب الطريقة معقدة الخطوط, مع تقنين القضايا كافة.والثاني هو أن ليس لدي أي فكرة ما تحكم مربع نص يستخدم كما StringFormat تحتها.

على أي حال, والنتيجة هي أن أنا دائما في نهاية المطاف مع العناصر الموجودة في العمود الأيمن التي هي من علامة التبويب.أعتقد أنني يمكن أن لفة بلدي النص نافذة أفعل كل شيء بنفسي ، ولكن يا إلهي, ليس هناك طريقة بسيطة للقيام بذلك ؟

    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();
هل كانت مفيدة؟

المحلول

إذا كنت تريد, يمكنك ترجمة هذا VB.Net رمز C#.النظرية هنا هو أنه يمكنك تغيير حجم علامة التبويب في عنصر التحكم.

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

أنا حولت نسخة إلى C# بالنسبة لك أيضا.اختبارها و تعمل في VS2005.

إضافة هذه العبارة باستخدام على النموذج الخاص بك:

using System.Runtime.InteropServices;

وضع هذا الحق بعد الطبقة الإعلان:

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

استدعاء هذا الأسلوب عندما تريد تعيين tabstops:

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

استخدامه هنا هو كل ما فعلته:

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

        textBox1.Text = "Hi\tWorld";
    }

نصائح أخرى

شكرا مات الحل الخاص بك يعمل كبيرة بالنسبة لي.هنا هو بلدي نسخة من التعليمات البرمجية الخاصة بك...

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

إذا كنت تريد شيئا حقا جداول السيدهارين الجواب هو فكرة جيدة.في DataGridView سوف تعطيك جدا جداول البيانات إكسل نوع من نظرة.

إذا كنت ترغب فقط في اثنين من تخطيط العمود (على غرار HTML الجدول) ، ثم محاولة الخروج من TableLayoutPanel.سوف تعطيك تخطيط تريدها مع القدرة على استخدام عناصر التحكم القياسية داخل كل خلية الجدول.

وأعتقد أن الطريقة الوحيدة هي أن تفعل شيئا على غرار ما تقوم به ، ولكن استخدام خط ثابت و لا الحشو مع المساحات حتى أن كنت لا داعي للقلق حول علامة التبويب التوسع.

لا مربعات النص تسمح HTML الاستخدام ؟ إذا كان هذا هو الحال, مجرد استخدام HTML إلى تنسيق النص إلى جدول.وإلا حاول إضافة نص إلى datagrid ثم إضافة ذلك إلى النموذج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top