【问题标题】:How to put textboxes into a datagrid?如何将文本框放入数据网格中?
【发布时间】:2010-07-30 08:38:18
【问题描述】:

VS 2010,WPF 项目。

我有一个数据网格,所有单元格中都有文本(数据来自自定义对象数组)。但是我无法复制任何单元格的 (ctrl+c) 内容。所以我想使用文本框来显示每个单元格的内容。真正的问题是我不能在 XAML 中执行此操作,但我必须在代码中动态执行此操作,因为整个网格是在代码中手动构建的,所以 XAML 只知道有一个网格。

我以这种方式添加列——我发现与列相关的只是我可以指定标题模板。如何为其构建单元格模板并将小部件设置为文本框?

            int i = 0;

            foreach (var db_col in query.FieldNames)
            {
                var col = new DataGridTextColumn();
                col.IsReadOnly = false;
                col.Header = db_col;
                col.Binding = new Binding(String.Format("Visual[{0}]", i));
                grid.Columns.Add(col);

                ++i;
            }

提前谢谢你。

已解决

感谢 Marko,我终于想出了这样的解决方案。

        foreach (var db_col in query.FieldNames)
        {
                var template = new DataTemplate();
                var elemFactory = new FrameworkElementFactory(typeof(TextBox));
                elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i)));
                template.VisualTree = elemFactory;

                var col = new DataGridTemplateColumn();
                col.CellTemplate = template;
                col.IsReadOnly = true;
                col.Header = db_col;
                grid.Columns.Add(col);

                ++i;
        }

【问题讨论】:

    标签: c# wpf templates datagrid


    【解决方案1】:

    首先,当单元格不处于编辑模式时,DataGridTextColumn 使用 TextBlock 来显示数据。这可能就是为什么你不能从中复制任何东西的原因。进入编辑模式后,TextBlock 将替换为 TextBox,然后您应该能够像往常一样复制/粘贴。

    考虑到您发布的代码没有提供您想要的功能,我只能假设您希望始终显示一个 TextBox。为此,您需要使用 DataGridTemplateColumn。因此,在您后面的代码中,您将创建一个新的 DataGridTemplateColumn,将它的 CellTemplate 设置为一个新的 DataTemplate,该 DataTemplate 又包含一个 TextBox。 您应该在此处找到一些使用 TextBox 创建 DataTemplate 的示例: Can i create DataTemplate in code-behind?

    另请注意,如果您确实创建了 DataGridTemplateColumn,则需要重新实现(如果需要)其他数据网格列中内置的某些行为。例如,如果 DataGrid 设置为 IsReadOnly = true,那么带有 TextBox 的 DataGridTemplateColumn 仍然是可编辑的。因此,您必须将 TextBox.IsReadOnly 属性绑定到 DataGrid.IsReadOnly 属性。

    【讨论】:

    • 太棒了!谢谢你。最初我在为单元格设置模板时遇到问题,因为我忘记更改列的类型。
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2012-07-29
    • 1970-01-01
    • 2013-09-15
    • 2022-06-10
    • 2020-03-16
    • 2013-11-04
    • 2012-10-22
    相关资源
    最近更新 更多