2

DataGridView情况就是这样:我想通过循环它的s来整体搜索一个单词Row,然后对于每个匹配项,我都会突出显示该单词。我面临的主要不灵活是列有不同System.Windows.Forms.DataGridViewContentAlignment的 s。因此,在单元格中绘制(突出显示)数学单词时,我应该注意单元格的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)匹配的单元格部分。

我知道我应该使用Event,但考虑到's CellPainting,我不知道如何在 a 中绘制单词CellCellContentAlignment

4

1 回答 1

1

我已经修改了我对这个问题的回答,以考虑方向和内容对齐。它适用于默认对齐,但您必须改进其他对齐的代码。

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;
}
于 2014-03-11T11:58:51.027 回答