1

これは簡単なことのように思えました。テキスト ウィンドウをポップアップ表示して、2 列のデータ (左側に説明、右側に対応する値) を表示したかっただけです。私は Forms をあまり扱っていないので、適切と思われる最初のコントロールである TextBox を取得しました。タブを使用すると 2 番目の列を簡単に作成できると思いましたが、うまくいかないことがわかりました。

私がこれをやろうとした方法には 2 つの問題があるようです (以下を参照)。まず、多くの Web サイトで、フォントが複雑で、カーニングの問題などにより、MeasureString 関数があまり正確ではないことを読みました。2 つ目は、TextBox コントロールが下にある 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();
4

5 に答える 5

1

マットに感謝します。あなたのソリューションは私にとってうまくいきました。ここにあなたのコードの私のバージョンがあります...

// 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);
}
于 2008-09-16T14:07:25.973 に答える
0

本当に表形式のものが必要な場合は、ハーレン氏の答えが良いでしょう。DataGridViewは、非常にExcelスプレッドシートタイプの外観を提供します。

2列のレイアウト(HTMLのテーブルと同様)が必要な場合は、TableLayoutPanelを試してください。各テーブルセル内で標準のコントロールを使用できる機能を備えた、希望するレイアウトを提供します。

于 2008-09-16T13:50:23.067 に答える
0

必要に応じて、この 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 ステートメントをフォームに追加します。

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

タブストップを設定する場合は、このメソッドを呼び出します。

    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";
    }
于 2008-09-16T13:39:37.697 に答える
-1

唯一の方法は、あなたがやっていることと似たようなことをすることだと思いますが、固定フォントを使用し、スペースで独自のパディングを行って、タブの拡張について心配する必要がないようにします。

于 2008-09-16T14:04:43.703 に答える
-2

テキスト ボックスで HTML を使用できませんか? その場合は、HTML を使用してテキストを表にフォーマットします。それ以外の場合は、テキストをデータグリッドに追加してから、それをフォームに追加してみてください。

于 2008-09-16T13:39:35.357 に答える