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

わんくま同盟

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

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

ツリー一括表示

DataGridViewコンボボックスの幅について /ふた (17/04/17(Mon) 11:44) #83863
Re[1]: DataGridViewコンボボックスの幅について /魔界の仮面弁士 (17/04/17(Mon) 17:46) #83864
  └ Re[2]: DataGridViewコンボボックスの幅について /ふた (17/04/18(Tue) 09:33) #83866 解決済み


親記事 / ▼[ 83864 ]
■83863 / 親階層)  DataGridViewコンボボックスの幅について
□投稿者/ ふた (4回)-(2017/04/17(Mon) 11:44:56)

分類:[.NET 全般] 

Windowsアプリケーション
VSバージョン:Express 2015
.NET Framework:4.5.2

DataGridViewを使用しセルごとにコンボボックスの表示項目を変更したいと思っています。

しかし、編集コンボボックス表示の際に、
コンボボックスのwidthがセルのwidthより大きいのが気になります。
このサイズを変更する方法を教えて頂けますでしょうか?
(DataGridViewComboBoxColumn列のセルでは問題はありません。)

列のColumnTypeはDataGridViewTextBoxColumnをデザイナ上で指定し、
セルごとにDataGridViewComboBoxCellを使用して項目を追加しています。
DropDownWidthプロパティを変更しても変わりません。

DataGridViewComboBoxCell cmb1 = new DataGridViewComboBoxCell();
cmb1.Items.Add("1");
cmb1.Items.Add("2");
cmb1.Items.Add("3");
cmb1.DropDownWidth = dgvTest[0, 0].Size.Width;
dgvTest[0, 0] = cmb1;

DataGridViewComboBoxCell cmb2 = new DataGridViewComboBoxCell();
cmb1.Items.Add("A");
cmb1.Items.Add("B");
cmb1.Items.Add("C");
cmb1.DropDownWidth = dgvTest[0, 1].Size.Width;
dgvTest[0, 1] = cmb2;

ちなみに、
cmb2のセルでコンボボックス表示後に、
cmb1のセルでコンボボックス表示時には
編集コンボボックスの幅はセル幅になっております。


グリッドのEditingControlShowingイベント時に、
DataGridViewComboBoxEditingControlが既にセル幅より大きかったので、
この段階で幅を変更しましたが反映されませんでした。
これより前に変更できれば良さそうと思うのですが・・・

宜しくお願い致します。
[ □ Tree ] 返信 編集キー/

▲[ 83863 ] / ▼[ 83866 ]
■83864 / 1階層)  Re[1]: DataGridViewコンボボックスの幅について
□投稿者/ 魔界の仮面弁士 (1262回)-(2017/04/17(Mon) 17:46:39)
No83863 (ふた さん) に返信
> グリッドのEditingControlShowingイベント時に、
> DataGridViewComboBoxEditingControlが既にセル幅より大きかったので、
> この段階で幅を変更しましたが反映されませんでした。

こちらでも試してみました。確かに反映されませんね。

根本的解決では無いですが、ひとまず下記のようにしてみたところ
幅が同期されているようです。確実な方法と言えるかは自信が無いですが。


DataGridView dgvTest;
protected override void OnLoad(EventArgs e)
{
 base.OnLoad(e);

 dgvTest = new DataGridView() { Name = "dgv" };
 dgvTest.Dock = DockStyle.Fill;
 dgvTest.EditMode = DataGridViewEditMode.EditOnEnter;
 Controls.Add(dgvTest);

 dgvTest.AutoGenerateColumns = false;

 dgvTest.RowCount = 100;
 dgvTest.ColumnCount = 4;

 var cmb1 = new DataGridViewComboBoxCell();
 cmb1.Items.AddRange("1", "2", "3");
 dgvTest[0, 0] = cmb1;

 var cmb2 = new DataGridViewComboBoxCell();
 cmb2.Items.AddRange("A", "B", "C");
 dgvTest[0, 1] = cmb2;

 
 Action act = delegate
 {
  var cmb = dgvTest.EditingControl as DataGridViewComboBoxEditingControl;
  if (cmb != null)
  {
   int w = cmb.EditingControlDataGridView.Columns[0].Width;
   if (cmb.DropDownWidth != w)
   {
    BeginInvoke(new Action(() => cmb.DropDownWidth = w));
   }
  }
 };
 dgvTest.EditingControlShowing += delegate { act(); };
 dgvTest.ColumnWidthChanged += delegate { act(); };
 //dgvTest.CellMouseDown += delegate { act(); };
 //dgvTest.CellContentClick += delegate { act(); };
}
[ 親 83863 / □ Tree ] 返信 編集キー/

▲[ 83864 ] / 返信無し
■83866 / 2階層)  Re[2]: DataGridViewコンボボックスの幅について
□投稿者/ ふた (5回)-(2017/04/18(Tue) 09:33:47)
No83864 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん
いつも回答ありがとうございます。
返信遅くなりすいません。

解決方法を見る前に、
昨日のコードを元にプログラムを作成していた所、
なぜか問題なく表示される事があり違いを調べてみました。

DataGridViewTextBoxColumn列のDefaultCellStyleフォント(デフォルトなし)を指定すると、
EditingControlShowingイベント時、
DataGridViewComboBoxEditingControlの幅を変更で反映されました。

根本的解決ではないのかもしれませんが、
フォントを変更しないといけないので、これにて実装しようと思います。

コードも書いて頂いたのに申し訳ありません。有難うございました。
解決済み
[ 親 83863 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -