2014-03-11 8 views
2

В этом случае: Я хочу найти слово в целом DataGridView через цикл s, а затем для каждого матча выделяю слово. Основная негибкость, с которой я сталкиваюсь, заключается в том, что столбцы имеют разные System.Windows.Forms.DataGridViewContentAlignment. Поэтому в paiting (выделение) математического слова в ячейках я должен позаботиться о ячейке ContentAlignment.DataGridView CellPainting: выделить слово в ячейке, учитывая направление содержимого ячейки

До сих пор я написал следующий код, чтобы найти спички

private int FindAllMatches() 
{ 
    int itemsFound = 0; 
    for (int r = 0; r < dgvMain.Rows.Count; r++) 
    { 
     DataGridViewRow row = dgvMain.Rows[r]; 
     for (int c = 0; c < Columns.Count; c++) 
     { 
      string cellValue = (dgvMain.Rows[r].Cells[c].Value ?? "").ToString(); 
      if (cellValue.Contains(SearchValue.ToString())) 
      { 
       HighlightRow(row); // highlights whole row, weak solution 
       itemsFound++; 
       break; 
      } 
     } 
    } 
    return itemsFound; 
} 

Но, как вы видите, я в настоящее время удалось выделить строки, которые имеют по крайней мере один матч. Мне нужен код, который выделяет только часть ячейки, которая соответствует моему конкретному слову (SearchValue).

Я знаю, что я должен использовать CellPainting событие, но я не знаю, как писать слово внутри Cell рассматривая Cell «s ContentAlignment

+0

Я ответил [подобный вопрос] (http://stackoverflow.com/questions/21989469/set-two-colors-text-in-a-single-datagridview-cell/21997432#21997432) – Junaith

+0

Привет @ Junaith, за последние пару недель я спрашивал о «DataGridView», и вы отвечали на них :) Я думаю, мы должны начать бизнес вместе;) шутить. Я проверю его и сообщит вам через пару минут ... –

+0

У меня проблема @Junaith, ваш код отлично подходит для текста на английском языке, но мой язык является персидским, написанным в направлении RightToLeft. С помощью [Текущий ответ, который вы предоставили] (http://stackoverflow.com/questions/21989469/set-two-colors-text-in-a-single-datagridview-cell/21997432#21997432) мой текст показан неправильно, например, если текст моей ячейки «نصب قفل سخت افزاری» показан как «فزاری نصب قفل سخت ا» –

ответ

1

Я изменил мой ответ на этот question рассмотреть направление и выравнивание контента. Он работает для выравнивания по умолчанию, но вам нужно улучшить код для других выравниваний.

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex != -1 && e.Value != null && e.Value.ToString().Length > 5 && e.ColumnIndex == 2) 
    { 
     if (!e.Handled) 
     { 
      e.Handled = true; 
      e.PaintBackground(e.CellBounds, dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected); 
     } 
     if ((e.PaintParts & DataGridViewPaintParts.ContentForeground) != DataGridViewPaintParts.None) 
     { 
      bool rightToLeft = this.RightToLeft == RightToLeft.Yes ? true:false; 
      string text = e.Value.ToString(); 
      string textPart1 = text.Substring(0, text.Length - 5); 
      string textPart2 = text.Substring(text.Length - 5, 5); 
      Size fullsize = TextRenderer.MeasureText(text, e.CellStyle.Font); 
      Size size1 = TextRenderer.MeasureText(textPart1, e.CellStyle.Font); 
      Size size2 = TextRenderer.MeasureText(textPart2, e.CellStyle.Font); 
      Rectangle rect1 = new Rectangle(e.CellBounds.Location, e.CellBounds.Size); 
      TextFormatFlags flags = GetFlagsForCellStyleAlignment(rightToLeft, e.CellStyle.Alignment); 
      TextRenderer.DrawText(e.Graphics, text, e.CellStyle.Font, rect1, Color.Crimson, flags); 
      using (Brush cellForeBrush = new SolidBrush(e.CellStyle.ForeColor)) 
      { 
       TextRenderer.DrawText(e.Graphics, textPart1, e.CellStyle.Font, rect1, e.CellStyle.ForeColor, flags); 
      } 
     } 
    } 
} 

TextFormatFlags GetFlagsForCellStyleAlignment(bool rigthToLeft, DataGridViewContentAlignment alignment) 
{ 
    TextFormatFlags flags = TextFormatFlags.Default; 
    switch (alignment) 
    { 
     case DataGridViewContentAlignment.TopLeft: 
      { 
       flags = TextFormatFlags.Default; 
       if (rigthToLeft) 
       { 
        flags |= TextFormatFlags.Right; 
       } 
       break; 
      } 
     case DataGridViewContentAlignment.MiddleLeft: 
      { 
       flags = TextFormatFlags.VerticalCenter; 
       if (rigthToLeft) 
       { 
        flags |= TextFormatFlags.Right; 
       } 
       break; 
      } 
    } 
    if (rigthToLeft) 
     flags |= TextFormatFlags.RightToLeft; 
    return flags; 
} 
+0

Хороший код для начала, но не полный. Ваш код действует по-разному, когда ячейка 'StartsWith' содержит слово и когда она содержит в себе слово и не начинается с него. –

+0

Кстати, я изменил свой код. Так что это не твоя вина. Код должен быть обработан ... –

+0

Да, я знаю ... но это будет сложно, так как вам нужно изменить выравнивание текста, основываясь на том, где ваши цветные буквы в слове. – Junaith