הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
Question
Monday, March 27, 2017 8:02 PM
I want select part of text in row and click button change color part text to (red or green ........) and save change color part text
All replies (7)
Monday, March 27, 2017 8:08 PM
Hi
A DataGridView doesn't support partial text color in a cell - only all of the text can be changed.
Regards Les, Livingston, Scotland
Monday, March 27, 2017 11:46 PM
The following DataGridView column was done in C# but can be used in VB.NET that works with RichText.
https://www.codeproject.com/Articles/31823/RichTextBox-Cell-in-a-DataGridView
I downloaded the source and tinkered a little e.g.
It's not easy no matter the language as you will need to manipulate cell data, parse and format with RTF raw codes.
Please remember to mark the replies as answers if they help and unmark them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.
VB Forums - moderator
Tuesday, March 28, 2017 8:35 AM
Hi srajmuneer,
It seems that you could not change the text color that you select in the datagridview cell by click button, but you can use DataGridView1_CellPainting event to change the color.
Dim mdtbColourMap As DataTable = Nothing
Private Sub Form14_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With DataGridView1
.Columns.Add("Column1", "Column1")
.Columns.Add("Column2", "Column2")
.Columns.Add("Column3", "Column3")
.Rows.Add("Welcome to_ the", "Wonderful-", "World of computing_")
.Rows.Add("This_ is what+ I", "Want-", "In My_ laptop")
.Rows.Add("X_is always+", "Greater-", "Than_ y")
.Columns(0).Width = 120
.Columns(1).Width = 120
.Columns(2).Width = 120
End With
'Above should be replaced with your data access
'Define the search terms and color for each
mdtbColourMap = New DataTable
mdtbColourMap.Columns.Add(New DataColumn("SearchTerm", GetType(String)))
mdtbColourMap.Columns.Add(New DataColumn("TextColor", GetType(Brush)))
mdtbColourMap.Rows.Add("_", Drawing.Brushes.Green)
mdtbColourMap.Rows.Add("+", Drawing.Brushes.Red)
mdtbColourMap.Rows.Add("-", Drawing.Brushes.Purple)
End Sub
Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
Dim newRect As New Rectangle(e.CellBounds.X + 1, e.CellBounds.Y + 1,
e.CellBounds.Width - 4, e.CellBounds.Height - 4)
Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)
Dim gridBrush As New SolidBrush(Me.DataGridView1.GridColor)
Dim gridLinePen As New Pen(gridBrush)
Try
' Erase the cell.
e.Graphics.FillRectangle(backColorBrush, e.CellBounds)
' Draw the grid lines (only the right and bottom lines;
' DataGridView takes care of the others).
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
e.CellBounds.Bottom - 1)
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
e.CellBounds.Top, e.CellBounds.Right - 1,
e.CellBounds.Bottom)
' Draw the inset highlight box.
e.Graphics.DrawRectangle(Pens.Blue, newRect)
' Draw the text content of the cell, ignoring alignment.
If (e.Value IsNot Nothing) Then
Dim strValue As String = CStr(e.Value)
Dim strWords() As String = Split(strValue, " ")
Dim strAlignment As String = "LEFT"
If e.ColumnIndex = 0 Then strAlignment = "RIGHT"
Dim sngX As Integer
If strAlignment = "LEFT" Then
sngX = e.CellBounds.X + 2
Else
sngX = e.CellBounds.Right - 4 - e.Graphics.MeasureString(strValue, e.CellStyle.Font).Width
End If
For i As Integer = 0 To strWords.GetUpperBound(0)
Dim brsTextColor As Drawing.Brush = Nothing
For j As Integer = 0 To mdtbColourMap.Rows.Count - 1
Dim strSearchTerm As String = mdtbColourMap.Rows(j).Item("SearchTerm").ToString
If InStr(strWords(i), strSearchTerm) > 0 Then
brsTextColor = DirectCast(mdtbColourMap.Rows(j).Item("TextColor"), Drawing.Brush) 'change the color
Exit For
End If
Next j
If brsTextColor Is Nothing Then
brsTextColor = Brushes.Black 'default
End If
e.Graphics.DrawString(strWords(i), e.CellStyle.Font, brsTextColor, sngX, e.CellBounds.Y + 2, StringFormat.GenericDefault)
sngX += e.Graphics.MeasureString(strWords(i), e.CellStyle.Font).Width
Next i
End If
e.Handled = True
Finally
gridLinePen.Dispose()
gridBrush.Dispose()
backColorBrush.Dispose()
End Try
End If
End Sub
More detailed info, please refer to DataGridView.CellPainting event.
Best Regards,
Cherry Bu
MSDN Community Support
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
Tuesday, March 28, 2017 3:38 PM
thank you Cherry Bu how to change color collection for text in datagridview use connection sql server in your code
Saturday, April 1, 2017 7:34 PM
thanks Kareninstructor , I'm sorry I'm try with your address and convert c# to vb.net but not work
thanks for answer , but I want change color or highlight to string , help code :
I'm try with my code but not work
Option Strict On
Option Explicit On
Option Infer Off
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.IO
Partial Public Class Form1
Inherits Form
'Private _table As New DataTable()
' Create new DataTable and DataSource objects.
Private _table As New DataTable()
Private Sub btnHighlight_Click(sender As Object, e As EventArgs) Handles btnHighlight.Click
For Each row As DataRow In _table.Rows
SetTextBoldByColumn(row, "col1", Me.txtSearch.Text)
SetTextBoldByColumn(row, "col2", Me.txtSearch.Text)
Next
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
_table.Columns.Add("col1")
_table.Columns.Add("col2")
_table.Rows.Add("First Row Cell2", "First Row Cell1 ")
_table.Rows.Add("Second Row Cell2", "Second Row Cell1 ")
Me.dataGridView1.DataSource = _table
End Sub
Private Sub SetTextBoldByColumn(row As DataRow, colName As String, boldText As String)
Dim plainText As String
If row.HasVersion(DataRowVersion.Original) Then
plainText = row(colName, DataRowVersion.Original).ToString()
Else
plainText = row(colName).ToString()
End If
row(colName) = GetRtf(plainText, Me.txtSearch.Text)
End Sub
Public Function GetRtf(originalText As String, boldText As String) As String
If String.IsNullOrEmpty(boldText) Then
Return originalText
End If
Dim rtf As String = "{\rtf " + originalText.Replace(boldText, (Convert.ToString("\b ") & boldText) + "\b0 ") + "}"
Return rtf
End Function
'Private Sub button2_Click(sender As Object, e As EventArgs) Handles button2.Click
' Dim f As New OpenFileDialog()
' f.Filter = "RTF file(*.rtf)|*.rtf"
' If f.ShowDialog() = DialogResult.OK Then
' Me.richTextBox1.LoadFile(f.FileName)
' End If
'End Sub
'Private Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click
' If Me.dataGridView1.CurrentCell IsNot Nothing Then
' 'this.dataGridView1.CurrentCell.Value = this.richTextBox1.Rtf;
' Me.dataGridView1.Rows(0).Cells(1).Value = Me.richTextBox1.Rtf
' End If
'End Sub
End Class
Saturday, April 1, 2017 7:42 PM
Hi
I don't know if this is of any help, but, here it is anyway.
Needs a DGV a TextBox1 and Button1
This example will search all the cells in a datagridview and if the contents CONTAIN the text in the textbox then willhighlight/embolden - if not a match, will reset to default.
Option Strict On
Option Explicit On
Option Infer Off
Public Class Form1
Private _table As New DataTable()
' set up colours and fontsfor Default and HighLight cells
Dim defFont As New Font("Arial", 10, FontStyle.Regular)
Dim highFont As New Font("Arial", 12, FontStyle.Bold)
Dim defColor As Color = Color.White
Dim highColor As Color = Color.Pink
Private Sub Form1_Load(sender As System.Object, e As EventArgs) Handles MyBase.Load
_table.Columns.Add("col1")
_table.Columns.Add("col2")
_table.Rows.Add("First Row Cell2", "First Row Cell1 ")
_table.Rows.Add("Second Row Cell2", "Second Row Cell1 ")
Me.DataGridView1.DataSource = _table
DataGridView1.DefaultCellStyle.BackColor = defColor
DataGridView1.AutoResizeRows()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' this button click will:
'look through all the cells and if any of them
' CONTAIN the text in the TextBox then will highlight
' and embolden them - otherwise reset to defaults.
If Trim(TextBox1.Text).Length < 1 Then Exit Sub
For Each r As DataGridViewRow In DataGridView1.Rows
If Not r.Index = DataGridView1.NewRowIndex Then
For Each c As DataGridViewCell In r.Cells
If Trim(c.Value.ToString.ToLower).Contains(Trim(TextBox1.Text.ToLower)) Then
c.Style.Font = highFont
c.Style.BackColor = highColor
Else
c.Style.Font = defFont
c.Style.BackColor = defColor
End If
Next
End If
Next
DataGridView1.AutoResizeRows()
End Sub
End Class
s.
Regards Les, Livingston, Scotland
Monday, April 3, 2017 3:15 PM
thank you Cherry Bu,your code how to use click button and take value to change color in textbox
example :
first to view datagridview the data normal
when write into textbox1. text = 'army , or , take , work' (search for any text to change color green)
and click button change color