如何将文本框放入数据网格?

时间:2010-07-30 08:38:19

标签: c# wpf templates datagrid

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;
        }

1 个答案:

答案 0 :(得分:2)

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

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

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