使用动态列

时间:2015-06-11 14:22:02

标签: c# silverlight datagrid

我使用List在后面的代码中动态创建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转换成一个Class,所以这个类的实例会形成网格行,但我无法理解如何进行这种转换

编辑:

根据下面的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>

1 个答案:

答案 0 :(得分:1)

Okey,让我在继续之前澄清一些困惑:

  

由于列是动态的,只在运行时知道,我需要   创建一个可以在运行时设置其属性的实体。

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

  

我想把我的ProdCatList转换成一个Class,以便实例   这个类会形成网格行

没有必要创建一个复杂的数据结构只是为了在DataGrid中插入一个空行,就像QuotationDG.Items.Add("");那样简单。

因此,根据我的理解,要么您过度复杂化问题,要么您没有提供足够的信息,而且我过于简单化了! (如果是这样,请告诉我,以便我可以直接纠正)。

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

DataGrid

修改

由于// 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中无法看到任何内容。为此,当列动态创建时,您还需要添加相应的DataGrid

DataBindings

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

// 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();
}

为了确保用户输入的数据也将更新源(例如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是否有任何更改