c# - 将空白行插入到具有动态列的数据网格中

标签 c# silverlight datagrid

我在后面的代码中使用列表动态创建我的 Silverlight DataGrid 的列,如下所示:

private void BuildQuotationDGColumns(List<ProductCategory> ProdCatList)
        {
            // add a template column with drop down list of products
            DataGridTemplateColumn ProductColumn = new DataGridTemplateColumn();
            ProductColumn.Header="Choose Product";
            ProductColumn.CellTemplate=(DataTemplate) Resources["ProductDDLTemplate"];
            QuotationDG.Columns.Add(ProductColumn);
            // for each entity in ProdCatList add a text column
            foreach (ProductCategory ProdCat in ProdCatList)
            {
                DataGridTemplateColumn ProdCatColumn = new DataGridTemplateColumn();
                ProdCatColumn.Header = ProdCat.Name;
                ProdCatColumn.CellTemplate = (DataTemplate)Resources["MoneyTemplate"];
                ProdCatColumn.CellEditingTemplate = (DataTemplate)Resources["MoneyEditingTemplate"];
                QuotationDG.Columns.Add(ProdCatColumn);
            }

            insertDummyRow(ProdCatList);

        }

我需要使用 insertDummyRow 在我的 Datagrid 中插入一个空白行。由于列是动态的并且仅在运行时已知,因此我需要创建一个可以在运行时设置其属性的实体。

我想将我的 ProdCatList 转换成一个类,这样这个类的实例就会形成网格行,但我不明白如何进行这种转换

编辑:

基于下面 Bahman_Aries 的解决方案, 我正在尝试将数据添加到我的行中,但我得到的是空行,并且我的数据 (column.Header.ToString()) 未添加。这是我的代码:

 CultureInfo provider= new CultureInfo("en-US");
 Object[] myrow= new Object[QuotationDG.Columns.Count];
 int i=0;
 foreach(DataGridColumn column in QuotationDG.Columns)
 {
      myrow[i] = Convert.ChangeType(column.Header.ToString(), typeof(object), provider);
    i++;
 }
 MyData.Add(myrow);
 QuotationDG.ItemsSource = MyData;

你能指出我做错了什么吗?

这是网格模板的实现:

<UserControl.Resources>
        <DataTemplate x:Key="MoneyTemplate">
            <TextBlock></TextBlock>
        </DataTemplate>

        <DataTemplate x:Key="MoneyEditingTemplate">
            <TextBlock></TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="ProductDDLTemplate">
            <ComboBox   />
        </DataTemplate>
    </UserControl.Resources>

最佳答案

好的,在我们继续之前让我澄清一些困惑:

Since the columns are dynamic and are only known in runtime, I need to create an entity whose attributes can be set in run time.

不一定,您可以使用对象列表。

I thought of converting my ProdCatList into a Class, so that instances of this class would form the grid rows

无需创建复杂的数据结构,只需在 DataGrid 中插入一个空行,就像 QuotationDG.Items.Add(""); 一样简单; 会做。

因此,据我了解,要么您将问题过于复杂化,要么您没有提供足够的信息,而我将其过于简单化了! (如果是这样,请告诉我,以便我可以立即更正)。

无论如何,由于您定义了 CellEditingTemplate,我假设您的网格单元格是可编辑的,因此您不能使用 QuotationDG.Items.Add,因为它会阻止编辑。相反,您应该定义一个列表,将数据添加到其中,然后将其用作 DataGridItemsSource:

// Your data source
ObservableCollection<object[]> MyData = new ObservableCollection<object[]>();


// Insert a blank row into the data source
private void insertDummyRow()
{
    MyData.Add(new object[QuotationDG.Columns.Count]);
    QuotationDG.ItemsSource = MyData;
}

编辑:

由于在您的 CellTemplates 中没有数据绑定(bind),因此在您的 DataGrid 中看不到任何内容。为此,当动态创建列时,您还需要添加相应的 DataBindings:

// Sample drop down list of products to show
public ObservableCollection<string> ProductList = new ObservableCollection<string> { "Item1", "Item2", "Item3" };
private void BuildQuotationDGColumns(List<ProductCategory> ProdCatList)
{
    // Define a DataGridComboBoxColumn 
    DataGridComboBoxColumn prodComboColumn = new DataGridComboBoxColumn();
    // Bind this column to the first item of the DataGrid.ItemsSource (e.g. MyData[0])
    prodComboColumn.SelectedItemBinding = new Binding("[0]");
    // Set ProductList as the ItemsSource of DataGridComboBoxColumn
    prodComboColumn.ItemsSource = ProductList;
    prodComboColumn.Header = "Choose Product";

    QuotationDG.Columns.Add(prodComboColumn);

    // For each entity in ProdCatList add a text column
    int i = 1;
    foreach (ProductCategory ProdCat in ProdCatList)
    {
        // Define a DataGridTextColumn 
        DataGridTextColumn ProdCatColumn = new DataGridTextColumn();
        ProdCatColumn.Header = ProdCat.Name;
        // Bind this column to the i-th item of the DataGrid.ItemsSource (e.g. MyData[i])
        ProdCatColumn.Binding = new Binding(string.Format("[{0}]", i));
        QuotationDG.Columns.Add(ProdCatColumn);
        i++;
    }
    insertDummyRow();
}

要查看 UI 是否显示任何数据,您可以尝试我修改后的添加数据过程:

private void Button_Click(object sender, RoutedEventArgs e)
{
    CultureInfo provider = new CultureInfo("en-US");
    Object[] myrow = new Object[QuotationDG.Columns.Count];
    int i = 0;
    foreach (DataGridColumn column in QuotationDG.Columns)
    {
        if (column is DataGridComboBoxColumn)
            myrow[i] = Convert.ChangeType(ProductList[0], typeof(object), provider);
        else
            myrow[i] = Convert.ChangeType(column.Header.ToString(), typeof(object), provider);

        i++;
    }
    MyData.Add(myrow);
    QuotationDG.ItemsSource = MyData;
}

为确保用户输入的数据也将更新源(例如 MyData),设置一个断点并检查 MyData 之后是否有任何更改手动编辑数据网格单元格。

关于c# - 将空白行插入到具有动态列的数据网格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783551/

相关文章:

c# - WPF MVVM-以编程方式触发datagrid排序方向的箭头

c# - 包失败,因为 System.Data.SqlClient.SqlException (0x80131904) : Incorrect syntax near 's'

c# - 组合框上的限制自动完成

linux - Linux/Mac 上的 Silverlight

c# - Windows Phone:无法使ViewportControl对齐

javascript - 使用 C# 的 Asp.Net,单击 Datagrid 行时打开 Web 表单

wpf - 如何将数据网格绑定(bind)到 wpf 中类的某些属性?

c# - 这个委托(delegate)方法在做什么?

c# - FxCop 静态代码分析 : Treat "DB" (and others) like "Id"

Silverlight 4 WCF RIA 服务和 MVVM 没有那么简单