2016-09-23 31 views
3

チャットボットを作成しようとしています。私は非常に正直になるだろう、UIは私の特権ではありません。ロジック部分のようにchatbotのバックエンドで作業していますが、テストのためには適切なUIが必要です。だから、私はwinformsを使いやすくしました。私は単一の列のDataGridViewを作成し、チャットウィンドウの下部にあるテキストボックスに書かれたすべてのテキストがDataGridViewの行として表示されます。 winformはすべての方向に成長するように固定されています。だから、私は、EXEを読み込むとき、私はそれを最大化すると、DataGridViewの部分とテキストボックスがそれに応じて成長する、小型のウィンドウとして表示されます。DataGridViewで行を折り返す

長い文字列を入力すると、winformが最大化された状態になっていないとき、テキストは可視領域の行に折り返されません。それは水平に伸び、明らかに画面には見えません。ウィンドウを最大化すると、テキストが表示されます。非常に長い文字列を与えてウィンドウを最大化すると、その文字列の大部分だけが行に表示され、画面サイズに収まるようになります。

何をしたいのですか?ウィンドウが最大化されているか最小化されているかにかかわらず、ウィンドウ内の文字列全体をラップ形式で見ることができるように、テキストを自動的に行に折り返してください。私が試してみました何

:単語ブレークを使用して

dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True; 
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
+0

その質問@Natriumテキストボックス、非常に異なっているのDataGridView、このものをいいます。 – stuartd

+0

私のテストプログラムで動作します。あなたはDefaultCellStyle.WapModeをどこかで上書きすることができますか? linqを使用してフォームのロードでこれを確認してください。 dataGridView1.Rows.SelectMany(row => row.Cells).All(cell => cell.InheritedStyle == DataGridViewTriState.True); –

+0

単語がスペースで区切られていると、それが折り返されますが、長い文字列が1つの場合は折り返しが機能しません。 – KChow

答えて

3

DataGridViewTextBoxを行うラッピング。それは、あなたが長いテキストを持っているならば、単語の最後にブレークが適用されることを意味します。あなたの要件に基づいて、単語の折り返しをするときに改行が必要です。そのためには、この方法をカスタムセルを作成して、文字ブレークの折り返しを実行する必要があります。文字ブレークワードラップに基づいて、セル/行の高さを計算する

  • オーバーライドGetPreferredSize方法を。そのためにはGraphics.MeasureStringメソッドを使用することができます。

  • Graphics.DrawStringメソッドを使用して文字区切り付きのラップ文字列を描画する方法をオーバーライドするPaintメソッド。

あなたは、これらの設定を行うことができます。

  • は、あなたの列にDataGridViewの幅を使用するには、あなたはそれがFillからAutoSizeModeだ設定する必要があります。この方法では、列の幅がグリッドを埋めるようになり、グリッドのサイズに応じてサイズが変更されます。また、複数の列がある場合は、FillWeightを設定して、他の列に対する列サイズの割合を制御できます。

  • 列のテキストを折り返すには、をDataGridViewTriState.Trueに設定する必要があります。

  • DataGridViewからDataGridViewAutoSizeRowsMode.AllCellsに設定する必要があります。

  • 作成したカスタムセルをCellTemplateという列に登録します。

MyDataGridViewTextBoxCell

このセルは、文字ブレークの代わりに、単語の区切りを使用してテキストの折り返しを行います。

public class MyDataGridViewTextBoxCell:DataGridViewTextBoxCell 
{ 
    protected override Size GetPreferredSize(Graphics graphics, 
     DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize) 
    { 
     if(cellStyle.WrapMode== DataGridViewTriState.True && this.RowIndex>=0) 
     { 
      var value= string.Format("{0}", this.FormattedValue); 
      using (var g = this.OwningColumn.DataGridView.CreateGraphics()) 
      { 
       var r = g.MeasureString(value, cellStyle.Font, this.OwningColumn.Width) 
          .ToSize(); 
       r.Width += cellStyle.Padding.Left + cellStyle.Padding.Right; 
       r.Height += cellStyle.Padding.Top + cellStyle.Padding.Bottom; 
       return r; 
      } 
     } 
     else 
     { 
      return base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize); 
     } 
    } 
    protected override void Paint(Graphics graphics, Rectangle clipBounds, 
     Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
     object value, object formattedValue, string errorText, 
     DataGridViewCellStyle cellStyle, 
     DataGridViewAdvancedBorderStyle advancedBorderStyle, 
     DataGridViewPaintParts paintParts) 
    { 
     base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
      formattedValue, errorText, cellStyle, advancedBorderStyle, 
      paintParts & ~ DataGridViewPaintParts.ContentForeground); 
     graphics.DrawString(string.Format("{0}", formattedValue), 
      cellStyle.Font, Brushes.Black, cellBounds); 
    } 
} 

public class Model 
{ 
    public string Text { get; set; } 
} 

BindingList<Model> list = new BindingList<Model>(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    var column1 = new DataGridViewTextBoxColumn(); 
    column1.CellTemplate = new MyDataGridViewTextBoxCell(); 
    column1.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
    column1.DataPropertyName = "Text"; 
    column1.DefaultCellStyle = new DataGridViewCellStyle(); 
    column1.DefaultCellStyle.WrapMode = DataGridViewTriState.True; 
    column1.HeaderText = "Text"; 
    column1.Name = "column1"; 

    dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
    dataGridView1.Columns.Add(column1); 

    this.dataGridView1.DataSource = list; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    list.Add(new Model() { Text = textBox1.Text }); 
} 
+0

素晴らしい。それはすごくうまくいった。助けてくれてありがとう。感謝します。 – KChow

+0

あなたは大歓迎です:) –

関連する問題