2016-09-23 3 views
3

Я пытаюсь создать чатбот. Я буду очень честен, UI не моя сильная сторона. Я работаю над бэкэндом чатбота, как в логической части, но для тестирования мне нужен правильный рабочий интерфейс. Итак, я выбрал более легкую в использовании winforms. Я создал один столбец DataGridView, и весь текст, написанный в текстовом поле в нижней части окна чата, появится в виде строк DataGridView. Винная форма привязана к росту во всех направлениях. Поэтому, когда я загружаю 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

Дело в том, что когда слова разделены пробелами, он обертывается, но если его одна длинная строка, то упаковка не работает. – KChow

ответ

3

DataGridViewTextBox выполняет обертывание с использованием слов-брейк. Это означает, что если у вас длинный текст, перерыв будет применяться только в конце слов. Основываясь на ваших требованиях, вам нужно разбить символ при переносе слов. Для этого необходимо создать пользовательскую ячейку и выполнить символьного нарушится Оберточным таким образом:

  • Override GetPreferredSize метод для вычисления высоты Cell/Row на основе символов перерыва переноса слов. Таким образом, вы можете использовать метод Graphics.MeasureString.

  • Override Paint метод нарисовать завернутую строку с разрывом символа с использованием метода Graphics.DrawString.

Вы можете выполнить следующие настройки:

  • Чтобы использовать ширину DataGridView для столбца, вы должны установить его AutoSizeMode в Fill. Таким образом, ширина столбца заполнит сетку и изменит ее размер в соответствии с размером сетки. Кроме того, если у вас было более одного столбца, вы можете установить FillWeight для управления процентом размера столбца относительно других столбцов.

  • Чтобы обернуть текст в столбце, вы должны установить DefaultCellStyle.WrapMode в столбце DataGridViewTriState.True.

  • Чтобы сделать ряды авторазмера, вы должны установить AutoSizeRowMode из 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

Добро пожаловать :) –

Смежные вопросы