C# 如何突出显示特定列中DataGridView中的搜索文本?

C# 如何突出显示特定列中DataGridView中的搜索文本?,c#,datagridview,highlight,C#,Datagridview,Highlight,参考这个问题,这个解决方案是可行的,但它会在整个datagridview中增加搜索字符串 我的问题是,是否可以在特定的列中搜索文本 以下是解决方案中的代码副本: string keyValue = "Co"; //search text private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.Value == null) return;

参考这个问题,这个解决方案是可行的,但它会在整个datagridview中增加搜索字符串

我的问题是,是否可以在特定的列中搜索文本

以下是解决方案中的代码副本:

string keyValue = "Co"; //search text

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.Value == null) return;

    StringFormat sf = StringFormat.GenericTypographic;
    sf.FormatFlags = sf.FormatFlags | StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.DisplayFormatControl;
    e.PaintBackground(e.CellBounds, true);

    SolidBrush br = new SolidBrush(Color.White);
    if (((int)e.State & (int)DataGridViewElementStates.Selected) == 0)
        br.Color = Color.Black;

    string text = e.Value.ToString();
    SizeF textSize = e.Graphics.MeasureString(text, Font, e.CellBounds.Width, sf);

    int keyPos = text.IndexOf(keyValue, StringComparison.OrdinalIgnoreCase);
    if (keyPos >= 0)
    {
        SizeF textMetricSize = new SizeF(0, 0);
        if (keyPos >= 1)
        {
            string textMetric = text.Substring(0, keyPos);
            textMetricSize = e.Graphics.MeasureString(textMetric, Font, e.CellBounds.Width, sf);
        }

        SizeF keySize = e.Graphics.MeasureString(text.Substring(keyPos, keyValue.Length), Font, e.CellBounds.Width, sf);
        float left = e.CellBounds.Left + (keyPos <= 0 ? 0 : textMetricSize.Width) + 2;
        RectangleF keyRect = new RectangleF(left, e.CellBounds.Top + 1, keySize.Width, e.CellBounds.Height - 2);

        var fillBrush = new SolidBrush(Color.Yellow);
        e.Graphics.FillRectangle(fillBrush, keyRect);
        fillBrush.Dispose();
    }
    e.Graphics.DrawString(text, Font, br, new PointF(e.CellBounds.Left + 2, e.CellBounds.Top + (e.CellBounds.Height - textSize.Height) / 2), sf);
    e.Handled = true;

    br.Dispose();
}
string keyValue=“Co”//搜索文本
私有void dataGridView1_CellPainting(对象发送方,DataGridViewCellPaintingEventArgs e)
{
如果(e.Value==null)返回;
StringFormat sf=StringFormat.GenericTyphographic;
sf.FormatFlags=sf.FormatFlags | StringFormatFlags.MeasureTracingSpace | StringFormatFlags.DisplayFormatControl;
e、 绘画背景(如CellBounds,真);
SolidBrush br=新的SolidBrush(颜色为白色);
如果(((int)e.State&(int)DataGridViewElementState.Selected)==0)
br.Color=颜色为黑色;
string text=e.Value.ToString();
SizeF textSize=e.Graphics.MeasureString(文本、字体、e.CellBounds.Width、sf);
int-keyPos=text.IndexOf(keyValue,StringComparison.OrdinalIgnoreCase);
如果(keyPos>=0)
{
SizeF textMetricSize=新的SizeF(0,0);
如果(keyPos>=1)
{
字符串textMetric=text.Substring(0,keyPos);
textMetricSize=e.Graphics.MeasureString(textMetric,字体,e.CellBounds.Width,sf);
}
SizeF keySize=e.Graphics.MeasureString(text.Substring(keyPos,keyValue.Length),Font,e.CellBounds.Width,sf);

float left=e.CellBounds.left+(keyPos通常,当所有者绘制
控件时,
绘制事件用于整个区域

事件是不同的;它分别为DGV中的每个(可见的)
单元调用

这意味着您只需检查要绘制的单元格,就可以完全缩小某些
单元格

包括
e.ColumnIndex
e.RowIndex
。您可以通过测试特定的列名来解决问题,如下所示:

if (dataGridView1.Columns[e.ColumnIndex].Name != "name") return;
string names = " firstname lastname ";
string colName = dataGridView1.Columns[e.ColumnIndex].Name;
if (names.Contains(" " + colName + " ")) return;
您还可以测试要包括或排除的列列表:

var names = new List<string> {"firstname", "lastname"};
string colName = dataGridView1.Columns[e.ColumnIndex].Name;
if (names.Contains(colName)) return;
没有
名称
,因此需要检查它们的索引。请注意,行标题列和列标题行都有
-1
作为索引,并且可以像其他单元格一样绘制和跳过


关于绘制DGV的其他值得注意的细节可以在MSDN上找到,,,,,,

您想要什么:只在一列中突出显示?在开始时测试该列,如果不在该列中,则返回。或者只突出显示作为搜索字符串的部分值?这似乎已经开始了。该代码突出显示了datagridview中的所有内容l包含搜索文本的所有列中的行。我希望它只突出显示一列中的所有搜索单元格,例如,我有4列(Id、名称、年龄、权重),我希望只在名称列中突出显示我的搜索文本。正如我所说的:插入一个条件:
if(e.Value==null)return;if(dataGridView1.columns[e.ColumnIndex].Name!=“Name”)return;
@TaW您可以发布答案,这样我就可以投票给您了