【问题标题】:How to get the cell content of DatagridTemplateColumn in wpf datagrid?如何获取 wpf datagrid 中 DatagridTemplateColumn 的单元格内容?
【发布时间】:2015-05-20 12:41:58
【问题描述】:

我有一个 DataGridTemplateColumn,其标题基本上由 StackPanel 组成,其中包含一个 Button 和 TextBlock。我想在加载 datagridrow 时访问单元格内容或 DataGridCell。

我的数据网格列之一如下所示:

<DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate >
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"  Click="HeaderButtonClick">
                                <Button.Content>
                                    <Path Stretch="Fill" Fill="Black" Stroke="{x:Null}" StrokeThickness="0.5" 
                                          Data="M3.875,0 L5.125,0 5.125,3.875 9,3.875 9,5.125 5.125,5.125 5.125,9 3.875,9 3.875,5.125 0,5.125 0,3.875 3.875,3.875 3.875,0 z" />
                                </Button.Content>
                            </Button>
                            <TextBlock Text="Fund" Margin="20,0,0,0"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
        <TextBlock Text="{Binding Fund}" Margin="20,0,0,0"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>

datagrid_loadingrow 事件看起来像

    var dg = sender as DataGrid;
    if (dg != null)
    {
        foreach (var item in dg.Columns)
        {
            DataGridCell cell1 = item.GetCellContent(row) as DataGridCell;
         }
    }

谁能帮我解决这个问题?

【问题讨论】:

  • 如果您需要帮助,请添加代码。

标签: c# wpf wpf-controls wpfdatagrid


【解决方案1】:

这是 WPF,而不是 WindowsForms。使用 WPF 时,我们将数据绑定到 UI 控件属性,而不是尝试以编程方式设置这些值。数据绑定时,您已经可以访问代码隐藏/视图模型中的数据,因此实际上无需尝试从 UI 控件访问它。

如果您查看 MSDN 上的 DataGridTemplateColumn Class 页面,您会看到以下示例:

<Grid>
    <Grid.Resources>
        <!--DataTemplate for Published Date column defined in Grid.Resources.  PublishDate is a property on the ItemsSource of type DateTime -->
        <DataTemplate x:Key="DateTemplate" >
            <StackPanel Width="20" Height="30">
                <Border Background="LightBlue" BorderBrush="Black" BorderThickness="1">
                    <TextBlock Text="{Binding PublishDate, StringFormat={}{0:MMM}}" FontSize="8" HorizontalAlignment="Center" />
                </Border>
                <Border Background="White" BorderBrush="Black" BorderThickness="1">
                    <TextBlock Text="{Binding PublishDate, StringFormat={}{0:yyyy}}" FontSize="8" FontWeight="Bold" HorizontalAlignment="Center" />
                </Border>
            </StackPanel>
        </DataTemplate>
        <!--DataTemplate for the Published Date column when in edit mode. -->
        <DataTemplate x:Key="EditingDateTemplate">
            <DatePicker SelectedDate="{Binding PublishDate}"  />
        </DataTemplate>
    </Grid.Resources>
    <DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <!--Custom column that shows the published date-->
            <DataGridTemplateColumn Header="Publish Date" CellTemplate="{StaticResource DateTemplate}" CellEditingTemplate="{StaticResource EditingDateTemplate}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

注意Bindings...例如,我们可以看到:

<DatePicker SelectedDate="{Binding PublishDate}"  />

这个值可以直接从数据绑定对象的PublishDate属性访问,而不是从DataGrid

DateTime publishDate = DataBoundCollection.ElementAt(relevantRowIndex).PublishDate;

您可以从 MSDN 上的 Data Binding Overview 页面了解有关数据绑定的更多信息。

【讨论】:

  • 好吧,我正在创建一个自定义 DataGrid,我想在我的应用程序中使用它,我还想要一个扩展和折叠行的特殊功能。
  • 这不会阻止您使用数据绑定。
  • 我想在行级别格式化数据,无论如何我发现了问题,我在 Loading Event 中检查了所有这些数据,而我现在根据 datagridloaded 事件检查了数据,我得到了单元格信息。感谢您的帮助。
【解决方案2】:

这是答案。您将如何使用代码访问模板列内容。如果您想访问任何类型的 Control 内容,例如 Button 内容,TextBlock 内容等。然后为这些控件创建加载事件。然后转到加载事件代码。在加载事件中,您将访问这些 控件的 内容 。 我将访问 Stack PanelButton 子项。
所以请遵循此代码。
Xaml:

<DataGridTemplateColumn>
            <DataGridTemplateColumn.HeaderTemplate >
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Loaded="StackPanel_Loaded">
                        <Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"  Click="HeaderButtonClick">
                            <Button.Content>
                                <Path Stretch="Fill" Fill="Black" Stroke="{x:Null}" StrokeThickness="0.5" 
                                      Data="M3.875,0 L5.125,0 5.125,3.875 9,3.875 9,5.125 5.125,5.125 5.125,9 3.875,9 3.875,5.125 0,5.125 0,3.875 3.875,3.875 3.875,0 z" />
                            </Button.Content>
                        </Button>
                        <TextBlock Text="Fund" Margin="20,0,0,0"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
    <TextBlock Text="{Binding Fund}" Margin="20,0,0,0"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

.cs

背后的代码
  private void StackPanel_Loaded(object sender, RoutedEventArgs e)
    {
        StackPanel stack = sender as StackPanel;
        Button button = stack.Children.OfType<Button>().FirstOrDefault();
        button.Content = "Change Content";

    }

在我的情况下,我想访问 模板列中的按钮。我使用了这段代码 XAML

       <DataGridTemplateColumn x:Name="deleteDG" Header="Delete"  >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate x:Uid="deletetemp" >
                        <Button Click="deleteBtn_Click" Loaded="Button_Loaded"   Width="95" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Background="White" Content="Delete"/>

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

.cs

背后的代码
   private void Button_Loaded(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        button.Content = "Change COntent";
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多