2016-09-23 3 views
3

대화방을 만들려고합니다. 나는 매우 솔직해질 것이며, UI는 나의 장점이 아니다. 로직 부분에서와 같이 chatbot의 백엔드에서 작업하고 있지만 테스트를 위해서는 적절한 작업 UI가 필요합니다. 그래서 winforms를 사용하기가 더 쉬웠습니다. 단일 열 DataGridView를 만들었고 채팅 창의 아래 부분에있는 텍스트 상자에 작성된 모든 텍스트가 DataGridView 행으로 나타납니다. winform은 모든 방향으로 성장하도록 고정되어 있습니다. 그래서, 내가 EXE를로드 할 때, 그것을 극대화 할 때, 소형 창으로 표시, DataGridView 부분과 텍스트 상자가 그에 따라 성장합니다.DataGridView에서 행 줄 바꾸기

긴 문자열을 입력하고 winform이 최대화 상태가 아닌 경우 텍스트가 보이는 영역의 행에 줄 바꿈되지 않습니다. 그것은 수평으로 확장되어 화면에는 보이지 않습니다. 창을 최대화 할 때 텍스트를 볼 수 있습니다. 매우 긴 문자열을주고 창을 최대화하면 문자열의 상당 부분 만 화면 크기에 맞을 수 있도록 행에 표시됩니다.

할 일 : 텍스트가 자동으로 줄 바꿈되어 창을 최대화하거나 최소화했는지 여부와 상관없이 창 전체에서 줄 바꿈 형식으로 볼 수 있습니다. 내가 시도 무엇

: 워드 브레이크를 사용

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

는 텍스트 박스에 매우 상이한 DataGridView에,이 중 하나를 지칭한다. – stuartd

+0

내 테스트 프로그램에서 작동합니다. DefaultCellStyle.WapMode를 대체 할 수 있습니까? linq를 사용하여 양식로드에서이를 확인하십시오. dataGridView1.Rows.SelectMany (row => row.Cells) .All (cell => cell.InheritedStyle == DataGridViewTriState.True); –

+0

단어가 공백으로 구분되어있을 때 랩핑되지만, 긴 긴 문자열이 있으면 랩핑이 작동하지 않습니다. – KChow

답변

3

DataGridViewTextBox 수행 포장. 긴 텍스트가 있으면 단어 끝에 단어 나누기가 적용됩니다. 요구 사항에 따라 단어 줄 바꿈을 할 때 문자 분리가 필요합니다.

  • 재정 GetPreferredSize 방법 문자 휴식 바꿈에 따라 셀/행의 높이를 계산하기 위해 이렇게하려면 사용자 정의 셀을 생성하고 문자 휴식 포장이 방법을 수행해야합니다. 그렇게하려면 Graphics.MeasureString 메소드를 사용할 수 있습니다.

  • Graphics.DrawString 메서드를 사용하여 문자 줄 바꿈을 사용하여 줄 바꿈 된 문자열을 그릴 때 Paint 메서드를 재정의하는 방법입니다.

당신은 이러한 설정을 수행 할 수 있습니다

  • 당신의 열의 DataGridView의 폭을 사용하려면, 당신은 Fill-AutoSizeMode의 설정해야합니다. 이렇게하면 열 너비가 눈금을 채우고 눈금 크기에 따라 크기가 변경됩니다. 또한 하나 이상의 열이있는 경우 FillWeight을 설정하여 다른 열과 비교하여 열 크기의 백분율을 제어 할 수 있습니다.

  • 열의 텍스트를 줄 바꾸려면 DataGridViewTriState.True 열의 DefaultCellStyle.WrapMode을 설정해야합니다.

  • 행을 자동 크기로 만들려면 AutoSizeRowModeDataGridView에서 DataGridViewAutoSizeRowsMode.AllCells으로 설정해야합니다.

  • 우리가 작성한 사용자 정의 셀을 CellTemplate 열로 등록하십시오.

이 세포 파쇄 문자 대신 워드 브레이크를 사용하여 텍스트 배치를 수행

을 MyDataGridViewTextBoxCell.질문 @Natrium

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

당신은 환영합니다 :) –