代码之家  ›  专栏  ›  技术社区  ›  greenoldman

如何将文本框放入数据报?

  •  0
  • greenoldman  · 技术社区  · 14 年前

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

    提前谢谢。

    解决了的

    多亏了马尔科,我终于想出了这样的解决办法。

            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 回复  |  直到 14 年前
        1
  •  2
  •   Marko    14 年前

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

    考虑到您发布的代码没有提供您想要的功能,我只能假设您总是希望显示一个文本框。为此,需要使用DataGridTemplateColumn。因此,在后面的代码中,您将创建一个新的DataGridTemplateColumn,将其CellTemplate设置为一个新的DataTemplate,Inturn包含一个文本框。 您应该在这里找到一些用于创建带有文本框的数据模板的示例: Can i create DataTemplate in code-behind?

    还请注意,如果确实创建了DataGridTemplateColumn,则需要重新实现(如有必要)其他DataGrid列中内置的一些行为。例如,如果将DataGrid设置为IsReadOnly=true,则带有文本框的DataGridTemplateColumn仍可以编辑。所以您必须将textbox.isreadOnly属性绑定到datagrid.isreadOnly属性。