我使用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>
答案 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
是否有任何更改