I needed to include a
DataGrid column with a click-able cell. I found no valid solutions on the net (except some sold control packages and some tricks like mousedown and mousemove/hit-test on the grid) and I saw that many were asking for it... I decided to write it on my own. It's very simple and basic but it works very well.
This is what I needed and this is what I wrote, you may want to adapt it to your needs.
Missing you-may-need-them things (add them yourself)
- Font change on the grid.
- Right to left implementation.
- Visited links.
- Underline with no mouse on it (I needed the underline to appear when the mouse moves over the link text).
- Custom colorization for the link.
How it looks
|Normal grid||Cursor in cell||Cursor on link||Cursor on link|
How it works
The control overrides some
DataGridColumnStyle methods (as you have to do when you write a custom
ColumnStyle). When the control is initialized (in its constructor) a generic
LinkLabel (this will be the main component that reacts to the clicks) is initialized with its standard size. When the
TableStyle is bound to a
DataGrid the control binds to some events.
MouseMove - Used to show/hide the control when the user moves the cursor on the grid.
DataSourceChanged - Used to hide the control (if visible) when the
BindingContextChanged - Used to hide the control (if visible) when the grid binding to data source changes.
PositionChanged (DataBinding) - Used to hide the control (if visible) when the position of the binding in the datasource changes. (IE: you click the link and the
DataGrid.Datasource is loaded with different data).
Paint (with overloads)
- Cell size:
How to use it
(Code used to take the pictures above)
Private Sub SetGridStyle()
Dim grdStyle As New DataGridTableStyle
Dim grdStileColEqv As New DataGridColumns.LinkLabel
grdStileColEqv.MappingName = "Equivalenti"
grdStileColEqv.HeaderText = "Eqv."
grdStileColEqv.Alignment = HorizontalAlignment.Center
grdStileColEqv.NullText = ""
grdStileColEqv.Width = 40
AddHandler grdStileColEqv.LinkClicked, AddressOf LinkClicked
Private Sub LinkClicked(ByVal sender As Object, _
ByVal e As LinkLabelLinkClickedEventArgs)
I hope you'll find this code useful. If you want to contribute fixing bugs and/or adding functions, let me know. I'll modify the code accordingly.