はじめまして、C#初心者です。

現在C#でWindowsアプリケーションを作成しており、
データベースからデータを複数行のTextBoxに呼び出しています。
TextBoxのプロパティは
WordWrap = true
Multiline = true
にしています。
TextBoxにはデータが改行された状態で表示されておりボタンイベントを発生させた時に
その表示に合わせた箇所に改行コードを入れたいと思っています。
TextBoxの表示部で改行している行の終端の文字を取得し、そこに改行コードを入れたいと思っているのですが各行の終端の文字を取得する方法がわかりません。
TextBox.Linesを取得しても元が一行の文字列なので区切りようが無く困っています。
ですが、表示とマッチしたところに改行コードを入れる方法がわからず四苦八苦しております。
どなたかご教授お願いします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2006/06/25 23:06:15
  • 終了:2006/07/02 23:10:03

回答(3件)

id:tian_x2001 No.1

tian回答回数42ベストアンサー獲得回数32006/06/25 23:53:58

ポイント27pt

改行コードは「¥r¥n」です。

textを「¥r¥n」でsplitすれば1行ずつに分割できるかと。

URLはダミーです

http://www.hatena.ne.jp/

id:masa182

回答ありがとうごさいます。

TextBoxに表示させたデータをCrystalReportsで印刷しているのですが、

印刷時にTextBoxの表示とCrystalReportsでの表示でずれが生じてしまっているので、TextBoxに改行コードを入れることでそのずれを解消したいと思っています。

改行コードで何を入れるかはわかっているのですが、TextBoxの表示部の改行されている箇所にイベントを発生時にこの改行コードを挿入できなくて困っています。よろしくお願いします。

2006/06/26 00:05:13
id:tian_x2001 No.2

tian回答回数42ベストアンサー獲得回数32006/06/26 00:14:06

ポイント27pt

あ、すみません。勘違いしてたみたいですね。

書き込んだ後で、「あ、質問の意味ってこういうことか」って気づきました。

先ほどはボケた回答をしてしまい、すみません。

http://dobon.net/vb/dotnet/graphics/measurestring.html

MeasureStringメソッドを使って文字列の描画幅を取得すれば

その描画幅から計算していくことで、TextBox内のどこで改行しているか

算出できるかと思います。

id:masa182

返信ありがとうございます。現在は別作業も並行しているためなかなか手をつけられていない状態です。今回の投稿を参考にいろいろ試してみようと思います。

2006/07/01 12:48:42
id:cx20 No.3

cx20回答回数607ベストアンサー獲得回数1082006/06/27 03:24:34

ポイント26pt

http://dobon.net/vb/dotnet/control/tbgetcaretposition.html

スマートな方法では無いのかもしれませんが、Win32 API を使用することで、テキストボックスから行単位でデータを取得することが可能です。

using System.Runtime.InteropServices;   // Marshal
 
 
[System.Runtime.InteropServices.DllImport("User32.Dll")]
private static extern int SendMessageW(IntPtr hWnd, int message, int wParam, IntPtr lParam);
private const int EM_GETLINECOUNT = 0xBA;
private const int EM_LINEINDEX    = 0xBB;
private const int EM_LINELENGTH   = 0xC1;
private const int EM_GETLINE      = 0xC4;
 
// テキストボックスの行数を取得
private int GetLineCount( IntPtr hWnd )
{
    return (int)SendMessageW( hWnd, EM_GETLINECOUNT, 0, IntPtr.Zero );
}
 
// 指定行の先頭の文字インデックスを取得
private int GetLineIndex( IntPtr hWnd, int nLine )
{
    return (int)SendMessageW( hWnd, EM_LINEINDEX, nLine, IntPtr.Zero );
}
 
// 指定した文字インデックスの文字数を取得
private int GetLineLength( IntPtr hWnd, int nLine )
{
    return (int)SendMessageW( hWnd, EM_LINELENGTH, nLine, IntPtr.Zero );
}
 
// 指定行のデータを取得
private string GetLine( IntPtr hWnd, int nIndex )
{
    int nCharSize = 2;  // UNICODE の1文字分のサイズ
    string strResult = "";
    int nLineIndex = GetLineIndex( hWnd, nIndex );
    int nLineLength = GetLineLength( hWnd, nLineIndex );
    int nBufSize = nLineLength * nCharSize;
    // バッファサイズ分ヒープ(メモリ領域)を確保
    IntPtr ptrLineData = Marshal.AllocHGlobal(nBufSize);
    byte[] buf = BitConverter.GetBytes((short)nBufSize);
    // バッファの先頭2バイトにバッファサイズ(nBufSize)をセット(API の仕様)
    Marshal.Copy(buf, 0, ptrLineData, 2);
    // 指定行(行インデックス)のデータを取得
    int cchText = SendMessageW( hWnd, EM_GETLINE, nIndex, ptrLineData);
    int nCopiedBufSize = cchText * nCharSize;
    buf = new byte[nCopiedBufSize];
    // ヒープ(メモリ領域)の内容をバイト配列にコピー
    Marshal.Copy(ptrLineData, buf, 0, nCopiedBufSize);
    // バイト配列を string 型に変換
    strResult = System.Text.Encoding.Unicode.GetString(buf);
    // ヒープ(メモリ領域)を開放
    Marshal.FreeHGlobal( ptrLineData );
    return strResult;
}
 
// テストコード
private void button1_Click(object sender, System.EventArgs e)
{
    IntPtr hWnd = textBox1.Handle;
    int nLineCount = GetLineCount(hWnd);    // 行数を取得
    string strLine = "";                    // 1行分のデータ保持用
    string strLines = "";                   // 複数行データ保持用
    for ( int i = 0; i < nLineCount; i++ )
    {
        strLine = GetLine( hWnd, i );       // 1行分のデータを取得
        strLines += strLine + "\r\n";       // 改行コードを追加して連結
    }
    // テキストボックスの情報を更新
    textBox1.Text = strLines;
}

<関連情報>

■ TextBoxと未実装メッセージ(1)

http://hongliang.seesaa.net/article/7052822.html

id:masa182

返信ありがとうございます。ソースまで書いていただき、とても参考になります。今は別作業と並行しているためあまり手をつけていない状態ですがソースやURLを参考にいろいろ試したいと思います。

2006/07/01 12:50:56

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません