人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: masa182
●カテゴリ:コンピュータ
✍キーワード:C# Windows はじめまして アプリケーション イベント
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tian
●27ポイント

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

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

URLはダミーです

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

◎質問者からの返答

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

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

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

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


2 ● tian
●27ポイント

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

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

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

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

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

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

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

◎質問者からの返答

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


3 ● cx20
●26ポイント

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ