none
datagrid 中我如何获得如第1行第1列的值? RRS feed

答案

  • 可能是指发布在 CodeProject 上的 WPFToolkit 中的 DataGrid 控制项 (这个是基于 UIElement 的 Control).

    但个人认为这个问题的意义不大 (不管是 DataGrid 或是 ListView 的 GridView). 就 WPF 而言, 第几行第几列, 呈现数据的是一个 简单的 Control 或者复合的 Control.
    或者这样说, 要获得 第一行第一列的数据 还是 获得第一行第一列包含数据的 UIElement?

    如果是数据, 可以从所 Binding 的数据集合中搜寻 (如果集合的项是基于 Object 的属性的, 为 Object 写个属性索引器更方便).
       (dg.Items[行序] As youObject)[列序]     ---------  基于 Indexer 属性的 Object, 而且是有序显示于 DataGrid 的.


    如果是 UIElement, 可以使用 VisualTreeHelper 来得到包含数据的 UIElement. 有必要知道一下 DataGrid 的 UIElement 的布局.
    dg 行由 DataGridRow 组成
         列由 DataGridCell 组成
        DataGridRow 的 VisualTree 如下:
        第一行 -DataGridRow
                    -Border
                      -SelectiveScrollingGrid
                        -ItemsPresenter
                          -DataGridCellsPanel
                            -DataGridCell            ------- 第 1 列
                              -Border
                                -ContentPresenter
                            -DataGridCell            ------- 第 2 列
                              -Border
                                -ContentPresenter
                           ....
        依此类推.
       因此 要得到第 n 行第 n 列的 UIElement, 可以使用下面的方法:
       DataGridRow pRow = dg.ItemContainerGenerator.ContainerFromIndex(行序) As DataGridRow; // 先得到行
       DataGridCell pCell = VisualTreeHelper.GetChild(
                                        VisualTreeHelper.GetChild(
                                          VisualTreeHelper.GetChild(
                                            VisualTreeHelper.GetChild(
                                              VisualTreeHelper.GetChild (
                                                VisualTreeHelper.GetChild(pRow,0)
                                              , 0)
                                            , 0)
                                          , 0)
                                        , 0)
                                      , 列序) As DataGridCell
       得到 Cell 后, 看看 DataGridCell 的 VisualTree 可以知道由 Border 组一个 ContentPresenter 组成.
       ContentPresenter 里包含的内容正是我们兴趣的东西.
       对于 ContentPresenter 内的 UIElement, 可以是任意的, 但 WPFToolkit 预设了几种:
       如果 Column 是 DataGridTextColumn, 那 最后 的ContentPresenter 是 TextBlock.
                               DataGridCheckBoxColumn 对应 CheckBox
                               DataGridHyperlinkColumn 对应 TextBlock (这个要注意, TextBlock-ContainerVisual-ContentPresenter-TextBlock, 也就是再有一层 TextBlock, 最后的 TextBlock 才是 Hyperlink 的内容)
                               DataGridComboBoxColumn 对应 ComboBox
                               DataGridTemplateColumn 对应你自己定义的东西.
      因此, 如果是基于 第一种 TextBlock 的, 那最终可以通过下面的代码得到感兴趣的东西:
      (pCell.Content As TextBlock).Text
      其余的可以 依此类推.


    Hope helps.

                               
       
    Hello, everyone
    2009年4月3日 14:40

全部回复

  • 楼主,你好

    WPF中没有DataGrid 这个control吧。
    如果是指Winform或者是ASP.NET中的,请发到相应的论坛。

    Microsoft Online Community Support
    2009年3月31日 7:55
  • 可能是指发布在 CodeProject 上的 WPFToolkit 中的 DataGrid 控制项 (这个是基于 UIElement 的 Control).

    但个人认为这个问题的意义不大 (不管是 DataGrid 或是 ListView 的 GridView). 就 WPF 而言, 第几行第几列, 呈现数据的是一个 简单的 Control 或者复合的 Control.
    或者这样说, 要获得 第一行第一列的数据 还是 获得第一行第一列包含数据的 UIElement?

    如果是数据, 可以从所 Binding 的数据集合中搜寻 (如果集合的项是基于 Object 的属性的, 为 Object 写个属性索引器更方便).
       (dg.Items[行序] As youObject)[列序]     ---------  基于 Indexer 属性的 Object, 而且是有序显示于 DataGrid 的.


    如果是 UIElement, 可以使用 VisualTreeHelper 来得到包含数据的 UIElement. 有必要知道一下 DataGrid 的 UIElement 的布局.
    dg 行由 DataGridRow 组成
         列由 DataGridCell 组成
        DataGridRow 的 VisualTree 如下:
        第一行 -DataGridRow
                    -Border
                      -SelectiveScrollingGrid
                        -ItemsPresenter
                          -DataGridCellsPanel
                            -DataGridCell            ------- 第 1 列
                              -Border
                                -ContentPresenter
                            -DataGridCell            ------- 第 2 列
                              -Border
                                -ContentPresenter
                           ....
        依此类推.
       因此 要得到第 n 行第 n 列的 UIElement, 可以使用下面的方法:
       DataGridRow pRow = dg.ItemContainerGenerator.ContainerFromIndex(行序) As DataGridRow; // 先得到行
       DataGridCell pCell = VisualTreeHelper.GetChild(
                                        VisualTreeHelper.GetChild(
                                          VisualTreeHelper.GetChild(
                                            VisualTreeHelper.GetChild(
                                              VisualTreeHelper.GetChild (
                                                VisualTreeHelper.GetChild(pRow,0)
                                              , 0)
                                            , 0)
                                          , 0)
                                        , 0)
                                      , 列序) As DataGridCell
       得到 Cell 后, 看看 DataGridCell 的 VisualTree 可以知道由 Border 组一个 ContentPresenter 组成.
       ContentPresenter 里包含的内容正是我们兴趣的东西.
       对于 ContentPresenter 内的 UIElement, 可以是任意的, 但 WPFToolkit 预设了几种:
       如果 Column 是 DataGridTextColumn, 那 最后 的ContentPresenter 是 TextBlock.
                               DataGridCheckBoxColumn 对应 CheckBox
                               DataGridHyperlinkColumn 对应 TextBlock (这个要注意, TextBlock-ContainerVisual-ContentPresenter-TextBlock, 也就是再有一层 TextBlock, 最后的 TextBlock 才是 Hyperlink 的内容)
                               DataGridComboBoxColumn 对应 ComboBox
                               DataGridTemplateColumn 对应你自己定义的东西.
      因此, 如果是基于 第一种 TextBlock 的, 那最终可以通过下面的代码得到感兴趣的东西:
      (pCell.Content As TextBlock).Text
      其余的可以 依此类推.


    Hope helps.

                               
       
    Hello, everyone
    2009年4月3日 14:40
  • 很感谢~~
    太有帮助了~~在一直以来在制作这方面的内容~~
    2009年4月5日 8:12