2010-12-15 7 views
8

DataGridViewにはかなり大きい文字列が含まれているComboBoxが入っています。ドロップダウンリストを自分自身に展開したり、文字列を少なくともワードラップして、ユーザーがComboBox列幅のサイズを変更しなくても文字列全体を見ることができるようにする方法はありますか?ComboBoxドロップダウンリストを作成するには、最大サイズのアイテムに合わせてサイズを変更しますか?

答えて

6

ここで、私はこの問題を解決するためにやったことだ素晴らしい作品...

public class ImprovedComboBox : ComboBox 
{ 
    public ImprovedComboBox() 
    { 



    } 
    public object DataSource 
    { 
     get { return base.DataSource; } 
     set { base.DataSource = value; DetermineDropDownWidth(); } 

    } 
    public string DisplayMember 
    { 
     get { return base.DisplayMember; } 
     set { base.DisplayMember = value; DetermineDropDownWidth(); } 

    } 
    public string ValueMember 
    { 
     get { return base.ValueMember; } 
     set { base.ValueMember = value; DetermineDropDownWidth(); } 

    } 
    private void DetermineDropDownWidth() 
    { 

     int widestStringInPixels = 0; 
     foreach (Object o in Items) 
     { 
      string toCheck; 
      PropertyInfo pinfo; 
      Type objectType = o.GetType(); 
      if (this.DisplayMember.CompareTo("") == 0) 
      { 
       toCheck = o.ToString(); 

      } 
      else 
      { 
       pinfo = objectType.GetProperty(this.DisplayMember); 
       toCheck = pinfo.GetValue(o, null).ToString(); 

      } 
      if (TextRenderer.MeasureText(toCheck, this.Font).Width > widestStringInPixels) 
       widestStringInPixels = TextRenderer.MeasureText(toCheck, this.Font).Width; 
     } 
     this.DropDownWidth = widestStringInPixels + 15; 
    } 
} 
+0

ありがとうございます。 DropDownイベントのDropDownWidthプロパティを変更することを選択しました。 –

+0

プロパティの隠蔽の代わりに、 'DataSourceChanged'、' ValueMemberChanged'、 'DisplayMemberChanged'イベントを購読する方が良いかもしれません。 –

+0

これはクラスのオーバーライドなので、最も簡単な方法は 'OnDropDown'のオーバーライドを追加して' base.OnDropDown(e) 'を実行する前に呼び出しを追加することです。そして、最後の 'if>'チェックのために、その計算を2回呼び出すのではなく、その幅を変数に格納するだけです。 – Nyerguds

-1

私が知っているわけではありませんが、一部のブラウザでは、ドロップダウンメニューの幅を必要に応じてボックスの幅を超えて拡大することができます。私はFirefoxを知っていて、あなたのユーザーベースを少しでもコントロールできるなら、Chromeはこれを行うことができます。

もしあなたが本当にフラッシュベースのコンボボックスのデータをHTMLにポストすることが必死であれば?

+0

winformsの回答を探していました。私は質問にwinformsを追加する必要があります。混乱させて申し訳ありません。 –

+0

ほとんどのブラウザは自動的にこれを自動的に行います。 – Nyerguds

3

これは非常にエレガントなソリューションです:

private void AdjustWidthComboBox_DropDown(object sender, System.EventArgs e) 
{ 
    ComboBox senderComboBox = (ComboBox)sender; 
    int width = senderComboBox.DropDownWidth; 
    Graphics g = senderComboBox.CreateGraphics(); 
    Font font = senderComboBox.Font; 
    int vertScrollBarWidth = 
     (senderComboBox.Items.Count>senderComboBox.MaxDropDownItems) 
     ?SystemInformation.VerticalScrollBarWidth:0; 

    int newWidth; 
    foreach (string s in ((ComboBox)sender).Items) 
    { 
     newWidth = (int) g.MeasureString(s, font).Width 
      + vertScrollBarWidth; 
     if (width < newWidth) 
     { 
      width = newWidth; 
     } 
    } 
    senderComboBox.DropDownWidth = width; 
} 

は、コンボボックスは、最長の文字列の幅にリスト幅をドロップダウン調整

出典: Calculating ComboBox DropDownWidth in C#

関連する問題