C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: DataGridViewで文字列の終端を右寄せにしたい


(過去ログ 92 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■55146 / inTopicNo.1)  DataGridViewで文字列の終端を右寄せにしたい
  
□投稿者/ ごう (196回)-(2010/11/18(Thu) 11:46:21)

分類:[.NET 全般] 

Visual Studio 2008 Express Editionを使用し、C++/CLIでアプリケーションを作成しています。

DataGridViewの特定の列のみ、文字列の終端を右寄せにして表示したいのです。
過去にあった、類似の質問ですが、これと同じことをDataGridViewで実現する方法を教えてください。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=37893&KLOG=65

また、「列の幅に対応した文字数分だけ文字列をぶった切る方法」は今回は使わない方向でいい方法があれば教えてください。
(文字列全体をマウスオーバー時に現れるToolTipに表示させたいため)

よろしくお願いします。
引用返信 編集キー/
■55149 / inTopicNo.2)  Re[1]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ 魔界の仮面弁士 (1948回)-(2010/11/18(Thu) 11:59:07)
No55146 (ごう さん) に返信
> DataGridViewの特定の列のみ、文字列の終端を右寄せにして表示したいのです。
標準の右寄せ表示で都合が悪いのであれば、
CellPainting イベントでオーナードローしてみては如何でしょう。
引用返信 編集キー/
■55159 / inTopicNo.3)  Re[2]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ ごう (197回)-(2010/11/18(Thu) 16:02:24)
No55149 (魔界の仮面弁士 さん) に返信

> 標準の右寄せ表示で都合が悪いのであれば、
> CellPainting イベントでオーナードローしてみては如何でしょう。


お返事ありがとうございます。
CellPaintingイベントを使っていますが、まだ実現できていません。
終端を右寄せにして表示したいのですが、どのメソッドを使用したらよいかわかっていません。

下記ソースコードを掲載します。
【A】【B】あたりに何か処理を加えていけばいいのかな、とは思うのですが、
どんな処理を入れていったらよいかわかりません。

お分かりでしたら教えてください。


private: System::Void dataGridView1_CellPainting(System::Object^  sender, System::Windows::Forms::DataGridViewCellPaintingEventArgs^  e) 
{
    // 0列目		 
    if(e->ColumnIndex == 0)
    {
        【A】
   
        // セルを描画する
        e->Paint(e->ClipBounds, DataGridViewPaintParts::All);
	
        【B】
			
        //描画が完了したことを知らせる
        e->Handled = true;
    }
}

引用返信 編集キー/
■55170 / inTopicNo.4)  Re[3]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ 魔界の仮面弁士 (1950回)-(2010/11/18(Thu) 20:26:28)
No55159 (ごう さん) に返信
> CellPaintingイベントを使っていますが、まだ実現できていません。
その前に
>> 標準の右寄せ表示で都合が悪いのであれば、
はどうでしたか? セルスタイルの Alignment に右寄せ(MiddleRight 等)を
指定するだけでは都合が悪かったのでしょうか。


> 終端を右寄せにして表示したいのですが、どのメソッドを使用したらよいかわかっていません。
TextRenderer.DrawTextメソッド、あるいはGraphics.DrawStringメソッドですね。
TextFormatFlags や StringFormat を指定してみてください。
引用返信 編集キー/
■55180 / inTopicNo.5)  Re[4]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ ごう (198回)-(2010/11/19(Fri) 08:05:29)
No55170 (魔界の仮面弁士 さん) に返信

お返事ありがとうございます。

> その前に
> >> 標準の右寄せ表示で都合が悪いのであれば、
> はどうでしたか? セルスタイルの Alignment に右寄せ(MiddleRight 等)を
> 指定するだけでは都合が悪かったのでしょうか。

そうですね。やりたいことは「文字列の終端を右寄せにしたい」のです。
「ABCDEFG」という文字列があり、DataGridViewのセルの幅が4文字分しかないとしたら
デフォルトでは「ABCD…」と表示されますが、これを「…DFEG」といった感じで表示したいのです。
セルスタイルの Alignment に右寄せを適用するのでは表示される文字列は文字列の冒頭からになってしまいますので、今回は向いていませんでした。


>>終端を右寄せにして表示したいのですが、どのメソッドを使用したらよいかわかっていません。
> TextRenderer.DrawTextメソッド、あるいはGraphics.DrawStringメソッドですね。
> TextFormatFlags や StringFormat を指定してみてください。

今から調べてやってみます。
引用返信 編集キー/
■55183 / inTopicNo.6)  Re[5]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ 魔界の仮面弁士 (1952回)-(2010/11/19(Fri) 10:14:07)
No55180 (ごう さん) に返信
> 「ABCDEFG」という文字列があり、DataGridViewのセルの幅が4文字分しかないとしたら
> デフォルトでは「ABCD…」と表示されますが、これを「…DFEG」といった感じで表示したいのです。

ellipsis を表示させるのはキツイかも。

単純にトリムするだけなら、TextFormatFlags で Right,SingleLine,VerticalCenter あたりを付ければ
下記のようになりますが、EndEllipsis や WordEllipsis を指定すると、省略記号は右端に付いてしまいます。
http://www.vb-user.net/junk/replySamples/2010.11.19.09.53/MiddleRight1.png

RightToLeft を付ければ、左端に省略記号がいちおう来ますが、求める形式とは違いそうですし。
http://www.vb-user.net/junk/replySamples/2010.11.19.09.53/MiddleRight2.png

どうしても必要なら、MeasureText で文字列長を測定したうえで、自分で省略記号を重ね描きするとか。
引用返信 編集キー/
■55184 / inTopicNo.7)  Re[6]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ ごう (199回)-(2010/11/19(Fri) 10:54:51)
2010/11/19(Fri) 11:06:13 編集(投稿者)
No55183 (魔界の仮面弁士 さん) に返信
終端の文字列5〜6文字程度が表示されれば使用には問題ないと判断したため
今回はEllipsisPathを使って対応することにしました。
「どうしても終端の文字列の表示が優先で、前方は省略記号で・・・」というのであれば
Ellipsisにもありませんし、地道にやっていかないといけなさそうですね。

EllipsisPathを使って実装したコードです。
お返事どうもありがとうございました。

private: System::Void dataGridView1_CellPainting(System::Object^  sender, System::Windows::Forms::DataGridViewCellPaintingEventArgs^  e) 
{
	// 0列目		 
	if(e->ColumnIndex == 0 && e->RowIndex >= 0)
	{
		// セルを描画する(線と背景)
		e->Paint(e->ClipBounds, DataGridViewPaintParts::Border);
		e->Paint(e->ClipBounds, DataGridViewPaintParts::Background);

		DataGridView^ dgv = (DataGridView^)sender;

		// 表示させる文字列
		String^ s = dgv->Rows[e->RowIndex]->Cells[e->ColumnIndex]->Value->ToString(); 


		// 表示領域を取得(セルの座標)
		System::Drawing::Rectangle rect = dgv->GetCellDisplayRectangle(e->ColumnIndex, 
                                                                                  e->RowIndex, true);
		// 微調整			
		rect.Y += 5;
		rect.Height -= 8;
		
		// StringFormatオブジェクトの作成
		StringFormat^ sf = gcnew StringFormat();

		sf->Trimming = StringTrimming::EllipsisPath;
		
		e->Graphics->DrawString(s, 
                                          dgv->RowHeadersDefaultCellStyle->Font, 
                                          Brushes::Black, 
                                          rect, 
                                          sf);

		// 描画完了
		e->Handled = true;
	}
}

解決済み
引用返信 編集キー/
■55187 / inTopicNo.8)  Re[7]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ 魔界の仮面弁士 (1953回)-(2010/11/19(Fri) 12:38:03)
No55184 (ごう さん) に返信
> // 表示させる文字列
> String^ s = dgv->Rows[e->RowIndex]->Cells[e->ColumnIndex]->Value->ToString();
現在のセルの情報は、引数 e の FormattedValue あるいは Value プロパティから
得られますので、Rows 等を取得する必要はありません。

また、隣のセルの値を必要とする場合であっても、Rows や Cells を経由させず、
DataGridView のインデクサでアクセスした方が良いでしょう。


> Brushes::Black,
黒固定だと、選択されているセルに対して都合が悪い気がします。
描画前に e->State を判断し、それに応じて e->CellStyle から
SelectionForeColor / SelectionBackColor を得て描画してみては如何でしょう。
引用返信 編集キー/
■55191 / inTopicNo.9)  Re[8]: DataGridViewで文字列の終端を右寄せにしたい
□投稿者/ ごう (200回)-(2010/11/19(Fri) 14:50:15)
2010/11/19(Fri) 14:51:03 編集(投稿者)
アドバイスいただいた内容を元に、更に改良しました。
ありがとうございました。

■No55187 (魔界の仮面弁士 さん) に返信
private: System::Void dataGridView1_CellPainting(System::Object^  sender, 
                           System::Windows::Forms::DataGridViewCellPaintingEventArgs^  e) 
{	
	// 0列目		 
	if(e->ColumnIndex == 0 && e->RowIndex >= 0)
	{
		// セルを描画する(文字列以外)
		DataGridViewPaintParts parts =DataGridViewPaintParts::All & (~DataGridViewPaintParts::ContentForeground);
		e->Paint(e->ClipBounds, parts);

		DataGridView^ dgv = (DataGridView^)sender;

		// 表示させる文字列
		String^ s =  (String^)e->Value;

		// 表示領域を取得(セルの座標)
		System::Drawing::Rectangle rect = dgv->GetCellDisplayRectangle(e->ColumnIndex, e->RowIndex, true);
		// 微調整			
		rect.Y += 5;
		rect.Height -= 8;
		
		// StringFormatオブジェクトの作成
		StringFormat^ sf = gcnew StringFormat();

		// EllipsisPath
		sf->Trimming = StringTrimming::EllipsisPath;
		
		Brush^ brush;
		if((e->State & DataGridViewElementStates::Selected) == DataGridViewElementStates::Selected)
			brush = gcnew SolidBrush(e->CellStyle->SelectionForeColor); 
		else
			brush = gcnew SolidBrush(e->CellStyle->ForeColor); 

		e->Graphics->DrawString(s, 
                                dgv->RowHeadersDefaultCellStyle->Font, 
                                brush, 
                                rect, 
                                sf);
		
		// 描画完了
		e->Handled = true;
	}
}

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -