문제

이처럼 보였다는 쉬운 것입니다.내가 원하는 텍스트 창을 표시하는 두 열의 데이터에 대한 설명 왼쪽에서 해당 값이 오른쪽에 표시됩.나는 일을 하지 않았으로 형태로 많은 그래서 그냥을 잡고 첫 번째 제어하는 듯한 적절한,TextBox.나는 생각을 사용하여 탭을 것을 만들 수있는 쉬운 방법은 두 번째 열,그러나 내가 발견한 것들이 작동하지 않는다.

가 될 것으로 보인 두 가지 방식에 문제가 나는 이렇게 했습니다(아래 참조).첫째,내가 읽는 수많은 웹사이트에는 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";
    }

다른 팁

덕분에 매트는,당신의 솔루션을 위해 위대한 일 me.여기에는 나의 코드...

// 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 을 줄 것이다 당신은 매우 Excel 스프레드 시트 형식으로 보면 됩니다.

당신이 원하는 두 개의 열 레이아웃(비슷한 HTML 표),다음을 시도 사용하여 셀.그것은 당신에게 당신이 원하는 레이아웃과 함께 사용할 수있는 능력을 기준 컨트롤 내에서 각습니다.

내가 믿는 유일한 방법은 무언가를 하는 유사한 당신이 무엇을 하고 있지만,고정된 글꼴을 사용하고 당신의 자신의로 패딩은 공간 그래서 당신 걱정할 필요가 없에 대해 탭을 확장합니다.

지 않는 텍스트 상자를 허용하는 HTML 사용법?는 경우,다만 HTML 을 사용하여 텍스트 서식으로 표입니다.그렇지 않으면,시 추가 텍스트를 datagrid 다음을 추가하는 양식입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top