[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 783
  • Last Modified:

How do I access individual cell data in a WPF Datagrid from a custom control?

I have created a button column in my wpf form, but I need to use this button to access information in the datagrid.  How do I access the data in certain cells specifically if the data is autogenerated?  For example, if I wanted to access the data in column 4, row 2?
I can bind the button's context to some column data, then access the data via the sender object in the code.  But what if I want the button content to be something totally different?  Is there some other part of the button that I can bind this info to?  Am I going about this the wrong way?  Any help would be appreciated.
<my:DataGrid Name="DataGrid2" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" SelectionUnit="Cell">
<my:DataGrid.Columns>
<my:DataGridTemplateColumn>
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>                                            <Button Content="{Binding Path=SomeColumnData}"/>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>


Private Sub myButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    'Do something with sender.content
End Sub

Open in new window

0
GravityPilot
Asked:
GravityPilot
  • 3
1 Solution
 
GravityPilotAuthor Commented:
That should be button.content, not button.context.....sorry.
0
 
GravityPilotAuthor Commented:
Thanks CodeCruiser. I think I found what I needed from one of those links:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/74332b78-6bfd-4ac9-af85-dfd9bec87a29

I modified Whitts code to get just what I needed.  Thanks to Whitts for that code as well!!

Private Sub myButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        Dim depObj As DependencyObject = DirectCast(e.OriginalSource, DependencyObject)
        'Get to DataGridCell level
        While (depObj IsNot Nothing) AndAlso Not (TypeOf depObj Is DataGridCell) 'AndAlso Not (TypeOf depObj Is Primitives.DataGridColumnHeader)
            depObj = VisualTreeHelper.GetParent(depObj)
        End While

        If depObj Is Nothing Then
            MsgBox("Can't Find Grid Info")
            Exit Sub
        End If

        If TypeOf depObj Is DataGridCell Then
            Dim cell As DataGridCell = TryCast(depObj, DataGridCell)

            'Get to DataGridRow level
            While (depObj IsNot Nothing) AndAlso Not (TypeOf depObj Is DataGridRow)
                depObj = VisualTreeHelper.GetParent(depObj)
            End While

            If depObj Is Nothing Then
                Exit Sub
            End If

            Dim row As DataGridRow = TryCast(depObj, DataGridRow)

            Dim columnIndex As Integer = cell.Column.DisplayIndex
            Dim rowIndex As Integer = FindRowIndex(row)
            Try
                MsgBox(ExtractBoundValue(row, cell, "EmployeeCompID#").ToString)
            Catch ex As Exception
                MsgBox("DataGrid Indexing Error")
            End Try
        End If
    End Sub

    'Determine the index of a DataGridRow
    Private Function FindRowIndex(ByVal row As DataGridRow) As Integer
        Dim dataGrid As DataGrid = TryCast(ItemsControl.ItemsControlFromItemContainer(row), DataGrid)

        Dim index As Integer = dataGrid.ItemContainerGenerator.IndexFromContainer(row)

        Return index
    End Function

    Private Function ExtractBoundValue(ByVal row As DataGridRow, ByVal cell As DataGridCell, ByVal columnname As String) As Object

        Try

            ' find the object that is realted to this row
            Dim data As Object = row.Item

            ' extract the property value
            Dim properties As ComponentModel.PropertyDescriptorCollection = ComponentModel.TypeDescriptor.GetProperties(data)
            Dim [property] As ComponentModel.PropertyDescriptor = properties(columnname)
            Dim value As Object = [property].GetValue(data)

            Return value
        Catch ex As Exception
            Return "DataGrid Extraction Failed"
        End Try
    End Function

Open in new window

0
 
GravityPilotAuthor Commented:
None of these links gave me exactly what I needed.  But they were enough to get me going in the right direction.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now