2012-03-29 11 views
2

私はすべてのデータが表示され、列が完全にdatagridviewを満たすように、datagridviewの列のサイズを変更するメソッドを作成しています。私がしていることは次のとおりです。DataGridview.columns [i] .Widthプロパティを割り当てることができません

1)DataGridViewAutoSizeColumnsModeをAllCellsに設定します。これにより、セル内のすべてのデータが表示されます。

2)最後の列の右端とデータグリッドビューの右端の間のピクセル距離を計算します。

3)その距離を列の数で割ります。これにより、datagridviewを完全に埋めるために各列に追加する必要がある幅がわかります。

4)(3)の幅を各列に追加します。

これは、理論的には、列内のすべてのデータを表示し、データグリッドビューを完全に埋めます。

DataGridViewAutoSizeColumnsModefillに設定すると、列の幅はすべて同じになります。しかし、すべてのデータが同じ幅を持つわけではありません。したがって、ColumnsModeが塗りつぶされて設定されていると、一部のセルではエッジからデータが飛び出し、他のセルには空白が残っています。しかし、AllCellsに設定すると、DataGridviewの右端と右端の間に大きなギャップがあります。

問題:私は列幅プロパティを設定できないようです。私は、合計列幅がdatagridviewwidthより大きい場合は考慮していないことを認識しています。

private void autoSizeDGV(DataGridView dgv) 
    { 
     try 
     { 
      //Step 1 
      dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 
      //Step 2 
      int totalcellwidth = 0; 
      for (int i = 0; i < dgv.ColumnCount; i++) 
      { 
       totalcellwidth += dgv.Columns[i].Width; 
      } 
      //Step 3 
      int widthtoadd = (dgv.Width - totalcellwidth)/dgv.ColumnCount; 
      //Step 4 
      for (int i = 0; i < dgv.ColumnCount; i++) 
      { 
       Debug.WriteLine("previous dgv.Columns[" +i+ "]: " + dgv.Columns[i].Width); 
       dgv.Columns[i].Width += widthtoadd; 
       Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width); 
      } 
     } 
+1

あなたのコードは、列の幅を設定するための責任がある場合、あなたは 'DataGridViewAutoSizeColumnsMode.None'に' AutoSizeColumnsMode'を設定すべきではありませんか? – lsuarez

+0

まあ、私の問題を理解しました。どうやら、 'AutoSizeColumnsMode'を' None'以外のものに設定すると、非ユーザのカラムサイズの変更は無効になります。ご質問ありがとうございます。それは私自身の問題を解決するようになった。正しいコードは、 'AutoSizeColumsMode'文を' dgv.AutoResizeColumns(); 'に置き換えました。 – CurtisHx

+0

これを自分の質問に対する回答として追加し、待機期間が終了したらそれを受け入れて、これを読んでいる人が同じような問題に対する解決方法を簡単に特定できるようにすることができます。 – lsuarez

答えて

1

私は自分の質問に答えました。 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; ステートメントは、列幅に対するユーザー以外の変更を無効にします。したがってプログラム的に幅を変えようとするのは不可能です。しかし、代わりにdgv.AutoResizeColumns();を使用することで、すべてが機能します。

だから、正しい方法は次のとおりです。

private void autoSizeDGV(DataGridView dgv) 
    { 
     try 
     { 
      //Step 1 
      dgv.AutoResizeColumns(); 

      //Step 2 
      int totalcellwidth = 0; 
      for (int i = 0; i < dgv.ColumnCount; i++) 
      { 
       totalcellwidth += dgv.Columns[i].Width; 
      } 
      //Step 3 
      int widthtoadd = (dgv.Width - totalcellwidth)/dgv.ColumnCount; 
      //Step 4 
      for (int i = 0; i < dgv.ColumnCount; i++) 
      { 
       Debug.WriteLine("previous dgv.Columns[" + i + "]: " + dgv.Columns[i].Width); 
       dgv.Columns[i].Width += widthtoadd; 
       Debug.WriteLine("after dgv.Columns[" + i + "]: " + dgv.Columns[i].Width); 
      } 
     }