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

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

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

Re[1]: dataGridViewにて改行コードがある場合のみ改行


(過去ログ 168 を表示中)

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

■97200 / inTopicNo.1)  dataGridViewにて改行コードがある場合のみ改行
  
□投稿者/ 馬渕誠一 (1回)-(2021/04/13(Tue) 00:05:39)

分類:[C#] 

改行コードがある場合のみ改行、ない場合は、列幅を広げ文字が収まるようにしたいのですがうまくいきません。
どう書けばいいでしょうか?

//
// dataGridView1
//
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.TopLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.Color.Beige;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;
this.dataGridView1.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.DisplayedCells;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("MS ゴシック", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2;
this.dataGridView1.Location = new System.Drawing.Point(11, 49);
this.dataGridView1.Margin = new System.Windows.Forms.Padding(2);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.RowHeadersWidth = 51;
this.dataGridView1.RowTemplate.Height = 24;
this.dataGridView1.Size = new System.Drawing.Size(865, 413);
this.dataGridView1.TabIndex = 6;
引用返信 編集キー/
■97202 / inTopicNo.2)  Re[1]: dataGridViewにて改行コードがある場合のみ改行
□投稿者/ 魔界の仮面弁士 (3063回)-(2021/04/13(Tue) 14:52:54)
No97200 (馬渕誠一 さん) に返信
> どう書けばいいでしょうか?

過去ログ No78277 に、似たような話題がありましたね。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=78277&KLOG=133


> // dataGridView1
(抜粋)
> AutoSizeColumnsMode = DisplayedCells
> AutoSizeRowsMode = DisplayedCells

この設定は「セル内容を書き換えた時」や「ソート時」などには処理されますが、
スクロール時には考慮されないことに注意が必要です。


たとえば DisplayedCells モードにおいて、
先頭行の任意の列に「ABCDEFGHIJKLMNOPQRSTUVWXYZ」と記入して自動リサイズされた後、
垂直スクロールして、その先頭行を領域外に押し出したとします。

その後、同列の任意行に「12345」という短文を書くと、列幅が自動縮小されます。

この状態で、スクロールして先頭行に戻った場合、列幅は狭いままです。
そのため、長文がセル内に収まりきらない状態になってしまいます。



> 文字が収まるようにしたい

パフォーマンスとのトレードオフにはなりますが、DisplayedCells モードのまま
スクロールにも追従しようとするなら、こういう手もあります。

dataGridView1.Scroll += delegate
{
 dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
 dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.DisplayedCells);
};

このケースは、スクロールする度にセルサイズが変わることになるのが欠点です。
水平・垂直スクロールの両方が必要なケースでは使い勝手が悪いかもしれません。


スクロールに影響を与えないよう、最大のセルサイズを優先する形にする場合は
AllCells や AllCellsExceptHeaders モードを使うようにしてみてください。
このモードは全セルが計測対象になるため、行数・列数が増えると
DisplayedCells モードよりも負荷が上がります。

AllCells の欠点は、殆どのセルが短文で、一つのセルだけが長文だった場合、
長文セルにつられて、他のセルが余白ばかりになってしまうという点ですね。

どちらが良いかはケースバイケース。


また、予期せぬ位置で改行されてしまうワードラップの問題については、
下記のような対処方法があります。下記は AllCells モードの例です。

private void Form1_Load(object sender, EventArgs e)
{
  dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
  dataGridView1.ReadOnly = false;

  dataGridView1.DataSource = null;
  dataGridView1.AutoGenerateColumns = false;
  dataGridView1.RowCount = 100;
  dataGridView1.ColumnCount = 5;

  dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
  dataGridView1.AlternatingRowsDefaultCellStyle.WrapMode = DataGridViewTriState.True;
  dataGridView1.AllowUserToResizeColumns = false;
  dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
  dataGridView1.AllowUserToResizeRows = false;
  dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
  dataGridView1.CellEndEdit += (target, arg) =>
  { // 最大幅を設定してからリサイズしなおす
    dataGridView1.Columns[arg.ColumnIndex].Width = 0x10000;
    dataGridView1.AutoResizeRow(arg.RowIndex, DataGridViewAutoSizeRowMode.AllCells);
    dataGridView1.AutoResizeColumn(arg.ColumnIndex, DataGridViewAutoSizeColumnMode.AllCells);
  };
  dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
  dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);
}
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -