2016-02-09 6 views
1

Я хочу, чтобы объединить 3 DataGridView столбцов заголовков (3-й, 4-й, 5-й иОбъединить столбцы RTL DataGridView заголовок в C#

столбцы) и свойство RightToLeft в DataGridView включены. я пользователь

этот код:

private void PromotionButton_Click(object sender, EventArgs e) 
    { 
     dataGridView1.ColumnHeadersHeight = dataGridView1.ColumnHeadersHeight * 2; 
     dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 
     dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting); 
     dataGridView1.Paint += new PaintEventHandler(dataGridView1_Paint); 
     dataGridView1.Scroll += new ScrollEventHandler(dataGridView1_Scroll); 
     dataGridView1.ColumnWidthChanged += new DataGridViewColumnEventHandler(dataGridView1_ColumnWidthChanged); 

    } 
private void dataGridView1_Paint(object sender, PaintEventArgs e) 
    { 
     for (int j = 2; j < 5; j++) 
     { 
      Rectangle r1 = dataGridView1.GetCellDisplayRectangle(j, -1, true); 
      int w2 = dataGridView1.GetCellDisplayRectangle(j + 1, -1, true).Width; 
      r1.X += 1; 
      r1.Y += 1; 
      r1.Width = r1.Width + w2 - 2; 
      r1.Height = r1.Height/2 - 2; 
      e.Graphics.FillRectangle(new SolidBrush(dataGridView1.ColumnHeadersDefaultCellStyle.BackColor), r1); 

      StringFormat format = new StringFormat(); 

      format.Alignment = StringAlignment.Center; 
      format.LineAlignment = StringAlignment.Center; 
      e.Graphics.DrawString("رياضيات", dataGridView1.ColumnHeadersDefaultCellStyle.Font, 
       new SolidBrush(dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor), r1, format); 
     } 
void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) 
    { 
     Rectangle rtHeader = dataGridView1.DisplayRectangle; 
     rtHeader.Height = dataGridView1.ColumnHeadersHeight/2; 
     dataGridView1.Invalidate(rtHeader); 
    } 
    void dataGridView1_Scroll(object sender, ScrollEventArgs e) 
    { 
     Rectangle rtHeader = dataGridView1.DisplayRectangle; 
     rtHeader.Height = dataGridView1.ColumnHeadersHeight/2; 
     dataGridView1.Invalidate(rtHeader); 

    } 

    void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
    { 
     if (e.RowIndex == -1 && e.ColumnIndex > -1) 
     { 
      Rectangle r2 = e.CellBounds; 
      r2.Y += e.CellBounds.Height/2; 
      r2.Height = e.CellBounds.Height/2; 
      e.PaintBackground(r2, true); 
      e.PaintContent(r2); 
      e.Handled = true; 
     } 

    } 

Но результат не был похож на то, что я хочу, это было так:

enter image description here

Так как решить эту проблему?

+0

Но какой результат вы хотите? Как это должно выглядеть? – OhBeWise

+0

В результате слияние заголовков 3-го, 4-го и 5-го столбцов – user4340666

ответ

1

Предполагая, что вы хотите, чтобы эти три столбца объединены только один печать текста слияния, и вы хотите, чтобы объединить столбцы индексируются 2-4:

  1. Снимите петлю.
  2. Получить ширину все три нужных столбцов (вместо столбца j и j+1)
  3. Начните прямоугольник в левом столбце (столбец 4, а не 2), поскольку сетка позволили RightToLeft.
private void dataGridView1_Paint(object sender, PaintEventArgs e) 
{ 
    Rectangle r1 = dataGridView1.GetCellDisplayRectangle(4, -1, true); 
    int w2 = dataGridView1.GetCellDisplayRectangle(3, -1, true).Width; 
    int w3 = dataGridView1.GetCellDisplayRectangle(2, -1, true).Width; 
    r1.X += 1; 
    r1.Y += 1; 
    r1.Width = r1.Width + w2 + w3; 
    r1.Height = r1.Height/2 - 2; 
    e.Graphics.FillRectangle(new SolidBrush(dataGridView1.ColumnHeadersDefaultCellStyle.BackColor), r1); 

    StringFormat format = new StringFormat(); 

    format.Alignment = StringAlignment.Center; 
    format.LineAlignment = StringAlignment.Center; 
    e.Graphics.DrawString("رياضيات", dataGridView1.ColumnHeadersDefaultCellStyle.Font, 
     new SolidBrush(dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor), r1, format); 
} 

Кроме того, я предложил бы использовать следующее выравнивание, чтобы предотвратить текст заголовка из частичной обструкции:

dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter; 

Screen of the Merged Cells

+0

Большое спасибо, это то, что я хочу, я очень ценю вашу помощь .. – user4340666