none
DataGridViewのセルで、連続した半角英数字文字列を折り返す方法 RRS feed

  • 質問

  • Windows7(SP1) Visual Studio 2008 Professioanal(SP1)(C#-ターゲットフレームワーク 2.0) を使って、ウエブサイトの検索情報をDataGridViewで表示するWindowsアプリを制作しています。
    この中では、表示する情報をDataTableに格納し、これをDataGridviewのDataSourceプロパティに代入して表示を行っています。

    一部の列については、
        dgv1.Columns["link"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
    として、一行に納まらない内容を折り返して表示させていますが、
    リンクのように半角英数字が連続する文字列の場合には、文字列の途中での折り返しができません。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/527dgvwrapmode/dgvwrapmode.html
    を見ても、
    「連続する半角英数字は途中では折り返されない(単語と単語の間でしか改行されない)」
    とありますので、仕様上だめなのかもしれませんが、
    このような場合でも折り返しを行うような Tips がもしありましたら、ご教示ください。

    私が現在問題を感じているDataGridViewの列はリンクを表示するものですので、
    「http://」より後に出てくる「/」の後ろに半角スペースを入れたものをDataTableに格納してとりあえずの対処をしており、
    挿入した半角スペースのところで折り返しはできるのですが、
    やや冗長な表示になりますし、
    また、クエリ文字列が長く続くリンクの場合には対処できないという問題を抱えています。

    2011年8月9日 2:19

回答

  • こんなふうに自前で描画すれば可能

    public partial class Form1 : Form
    {
      public Form1()
      {
        DataGridView dgv = new DataGridView();
        dgv.Dock = DockStyle.Fill;
    
        DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
        col.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        dgv.Columns.Add(col);
    
        this.Controls.Add(dgv);
    
        dgv.Rows.Add("ABCDEFGHIJKLMNOPQR12345");
    
        dgv.CellPainting += new DataGridViewCellPaintingEventHandler(dgv_CellPainting);
      }
    
      void dgv_CellPainting(object sender , DataGridViewCellPaintingEventArgs e)
      {
        if (e.CellStyle.WrapMode == DataGridViewTriState.True && e.FormattedValue != null && e.FormattedValue is string)
        {
          string s = (string)e.FormattedValue ;
          if (s.Length > 0)
          {
            DataGridView dgv=(DataGridView)sender;
    
            DataGridViewPaintParts parts = e.PaintParts & ~DataGridViewPaintParts.ContentForeground;
            e.Paint(e.CellBounds , parts); ;
    
            Brush brush;
            if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected)
            {
              brush = new SolidBrush(e.CellStyle.SelectionForeColor);
            }
            else
            {
              brush = new SolidBrush(e.CellStyle.ForeColor);
            }
    
            StringFormat sf = new StringFormat();
            sf.Trimming = StringTrimming.Character; //これ
            e.Graphics.DrawString(s , e.CellStyle.Font ,brush,e.CellBounds ,sf );
            brush.Dispose();
            e.Handled = true;
          }
    
        }
      }
    }
    
    #スペースが入ってるとだめですが…

     


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク はむさん 2011年8月9日 4:54
    2011年8月9日 3:30

すべての返信

  • こんなふうに自前で描画すれば可能

    public partial class Form1 : Form
    {
      public Form1()
      {
        DataGridView dgv = new DataGridView();
        dgv.Dock = DockStyle.Fill;
    
        DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
        col.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        dgv.Columns.Add(col);
    
        this.Controls.Add(dgv);
    
        dgv.Rows.Add("ABCDEFGHIJKLMNOPQR12345");
    
        dgv.CellPainting += new DataGridViewCellPaintingEventHandler(dgv_CellPainting);
      }
    
      void dgv_CellPainting(object sender , DataGridViewCellPaintingEventArgs e)
      {
        if (e.CellStyle.WrapMode == DataGridViewTriState.True && e.FormattedValue != null && e.FormattedValue is string)
        {
          string s = (string)e.FormattedValue ;
          if (s.Length > 0)
          {
            DataGridView dgv=(DataGridView)sender;
    
            DataGridViewPaintParts parts = e.PaintParts & ~DataGridViewPaintParts.ContentForeground;
            e.Paint(e.CellBounds , parts); ;
    
            Brush brush;
            if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected)
            {
              brush = new SolidBrush(e.CellStyle.SelectionForeColor);
            }
            else
            {
              brush = new SolidBrush(e.CellStyle.ForeColor);
            }
    
            StringFormat sf = new StringFormat();
            sf.Trimming = StringTrimming.Character; //これ
            e.Graphics.DrawString(s , e.CellStyle.Font ,brush,e.CellBounds ,sf );
            brush.Dispose();
            e.Handled = true;
          }
    
        }
      }
    }
    
    #スペースが入ってるとだめですが…

     


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク はむさん 2011年8月9日 4:54
    2011年8月9日 3:30
  • gekka様

    早速、ご回答をいただき、ありがとうございました。

    ご教示いただいたコードで、連続した半角英数字文字列をセル内で折り返せることを確認いたしました。

    このコードを私のソフトウエアに実装する場合には、「MICROSOFT LIMITED PUBLIC LICENSE」を参照するようにいたします。

    取り急ぎ、お礼まで。

     

    2011年8月9日 4:54