【问题标题】:How to put data in WPf Data Grid specific cell如何将数据放入 WPf 数据网格特定单元格
【发布时间】:2011-09-07 12:55:09
【问题描述】:

我在 WPF 中使用 DataGrid

我想在某个特定的单元格中放置一些特定的字符串。我们怎样才能做到这一点。

我是这样评价价值的。

//pPredicate 是一个字符串变量,有一些值 // 我在一个特定的单元格中分配(第 3 列)

         if (GetCell(3).Content is TextBlock)
            {
                ((TextBlock)(GetCell(3).Content)).Text = pPredicate;
            }
            else // TextBox
            {
                ((TextBox)(GetCell(3).Content)).Text = pPredicate;
            }



private DataGridCell GetCell(int column)
        {
            DataGridRow rowContainer = GetRow();

            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                // Try to get the cell but it may possibly be virtualized.
                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                if (cell == null)
                {
                    // Now try to bring into view and retreive the cell.
                    customDataGrid.UCdataGridView.ScrollIntoView(rowContainer, customDataGrid.UCdataGridView.Columns[column]);
                    cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                }
                return cell;
            }
            return null;
        }

       private DataGridRow GetRow()
        {
            DataGridRow row = (DataGridRow)customDataGrid.UCdataGridView.ItemContainerGenerator.ContainerFromIndex(_currentRowIndex);
            if (row == null)
            {
                // May be virtualized, bring into view and try again.
                customDataGrid.UCdataGridView.UpdateLayout();
                customDataGrid.UCdataGridView.ScrollIntoView(customDataGrid.UCdataGridView.Items[_currentRowIndex]);
                row = (DataGridRow)customDataGrid.UCdataGridView.ItemContainerGenerator.ContainerFromIndex(_currentRowIndex);
            }
            return row;
        }

       private T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        }

最上面的 statmetnts 中的问题是该行处于编辑模式,网格包含文本框,否则网格包含文本块。当我将值放入文本块时,它不会持续存在,而将值放入文本框会持续存在。

自定义 DataGrid 的 XAML 部分

            <WPFtoolkit:DataGridTextColumn x:Name="dgName" Binding="{Binding Path=Name}" Header="Name" MinWidth="100" Visibility="Collapsed"/>


            <WPFtoolkit:DataGridTextColumn x:Name="dgPredicates" Binding="{Binding Path=Predicate}" Header="Predicate" MinWidth="100"
                                           Visibility="Collapsed"/>



            <WPFtoolkit:DataGridTemplateColumn Header="Delete" IsReadOnly="True"
                                                                Visibility="Collapsed" MaxWidth="80" Width ="*">
                <WPFtoolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="../images/Delete.png" Height="15" Width="15"/>
                    </DataTemplate>
                </WPFtoolkit:DataGridTemplateColumn.CellTemplate>
            </WPFtoolkit:DataGridTemplateColumn>

            <WPFtoolkit:DataGridTextColumn Binding="{Binding Path=TreeType}" Header="Tree Type" Width="50"
                                       Visibility="Collapsed"/>
        </WPFtoolkit:DataGrid.Columns>
    </WPFtoolkit:DataGrid>

【问题讨论】:

  • 你用数据填充网格吗?
  • 我通过绑定一个DataTable来填充数据
  • 你的意思是像 MyDataTable.Rows[RowNumber]["MyColumn"] = "My Value";?
  • TextBlock.Text 绑定默认为OneWay。对于TextBox,它是TwoWay

标签: c# .net wpf datagrid


【解决方案1】:

如果我正确理解了您的问题,那么您希望将您对 TextBlock/TextBox 所做的更改传播到底层 DataTable。这适用于TextBox,但不适用于TextBlock

原因是TextBox.Text默认绑定TwoWay,但TextBlock.Text绑定OneWay。如果你想让它工作,你必须更改所有 TextBlock 绑定以明确使用 TwoWay like

<TextBlock Text="{Binding Path=SomeProperty, Mode=TwoWay}"/>

【讨论】:

  • 实际上我是通过 C# 代码而不是通过 XAML 做的,所以你可以用 C# 语法来指导一些事情
  • 当然可以,但我需要先知道您是如何创建列的。您无法修改正在使用的绑定,因此 AutoGeneratedColumns 将不起作用,您必须将其添加到列样式/模板定义中。是DataGridTextColumn 还是DataGridTemplateColumn
【解决方案2】:

如果您不想对 xaml 感兴趣,此代码可能会满足您的需要。 (xx ,yy 是行号和冒号)

DataGridCell 单元格 =(YourDgName.Columns[XX].GetCellContent(DgCagrilar.Items[YY])).Parent s DataGridCell; if (cell.Background == Brushes.Pink) 细胞.背景=画笔.梅花; 别的 cell.Background = Brushes.Pink;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2016-12-12
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多