【问题标题】:DataGridView CellPainting: Highlight word in cell considering cell's content directionDataGridView CellPainting:考虑单元格的内容方向突出显示单元格中的单词
【发布时间】:2014-04-14 20:53:41
【问题描述】:

就是这种情况:我想通过循环 Rows 在整个 DataGridView 中搜索一个单词,然后对于每个匹配项,我都会突出显示该单词。我面临的主要不灵活性是列有不同的System.Windows.Forms.DataGridViewContentAlignments。因此,在单元格中绘制(突出显示)数学单词时,我应该注意单元格的ContentAlignment

到目前为止,我已经编写了以下代码来查找匹配项

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 事件,但考虑到CellContentAlignment,我不知道如何在Cell 内绘制单词

【问题讨论】:

  • 我已回复similar question
  • 嗨@Junaith,在过去的几周里,我一直在询问DataGridView,你一直在回答他们:) 我认为我们应该一起创业;)开玩笑。我会检查它并在几分钟内通知您...
  • 我有一个问题@Junaith,你的代码适合英文文本,但我的语言是波斯语,是在RightToLeft 方向编写的。使用Current Answer you have provided,我的文本显示错误,例如,如果我的单元格文本是 'نصب قفل سخت افزاری',则显示为 'فزاری نصب قفل سخت ا'

标签: c# winforms datagridview highlighting paintevent


【解决方案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;
}

【讨论】:

  • 不错的开始代码,但不完整。当单元格 StartsWith 一个单词和 Contains 单元格中的单词并且不以它开头时,您的代码的行为不同。
  • 顺便说一句,我已经更改了您的代码。所以这不是你的错。代码应该在...
  • 是的,我知道...但这将具有挑战性,因为您必须根据单词中彩色字母的位置更改文本对齐方式。
  • 我正在研究它,但如果你能给我一个更完整的样本就更好了,不是因为我想让它更简单,因为我不理解某些部分并感到困惑.
  • 好的,我会尝试...您是要突出显示整个单词还是像 Hello World 这样的句子中的一个单词,还是像 Hello World 这样的句子中的多个单词,很高兴认识你或像passive这样的词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2018-05-21
  • 1970-01-01
  • 2010-12-17
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多