有人可以指出我关于上述方向的正确方向吗?
我有一个datagrid通过sqlite查询返回多行。在每一行中,我需要一个列表框,它应返回与该行关联的多个项目。我将数据网格中父表的引用ID作为列返回,但似乎无法找到在列表框中返回子记录的解决方案。
我想我需要通过“DataGridTemplateColumn”或其他东西来做这件事。
问题1:如何在xaml中构建它 问题2:如何迭代sql以在代码隐藏或任何其他方法中显示带有子列表框项的数据网格行
图形表示我需要什么
注意:每个ListBox也需要编辑
public void getItems()
{
try
{
string thisPermitID = "1";
DataTable potentialHazards;
String query = "select JSAPH.JobSafetyAnalysisStepPotentialHazardID \"JobSafetyAnalysisStepPotentialHazardID\""
+ ", JSA.RefPermitID \"RefPermitID\""
+ ", JSAPH.RefJobSafetyAnalysisStepID \"RefJobSafetyAnalysisStepID\""
+ ", JSAS.StepDescription \"StepDescription\""
+ ", JSAPH.PotentialHazard \"PotentialHazard\""
+ " from JobSafetyAnalysis JSA"
+ " inner join JobSafetyAnalysisStep JSAS on JSAS.RefJobSafetyAnalysisID = JSA.JobSafetyAnalysisID"
+ " inner join JobSafetyAnalysisStepPotentialHazard JSAPH on JSAPH.RefJobSafetyAnalysisStepID = JSAS.JobSafetyAnalysisStepID"
+ " where RefPermitID = '" + thisPermitID + "'";
potentialHazards = db.GetDataTable(query);
List<Item> PotentialHazardSelectedList = new List<Item>();
foreach (DataRow r in potentialHazards.Rows)
{
if (Items != null)
{
Items.Add(new Item()
{
Name = r["StepDescription"].ToString(),
ItemCollection = new ObservableCollection<string>() { r["PotentialHazard"].ToString() }
});
}
}
this.DataContext = Items;
}
catch (Exception fail)
{
String error = "The following error has occurred:\n\n";
error += fail.Message.ToString() + "\n\n";
MessageBox.Show(error);
}
}
答案 0 :(得分:1)
由于你还没有得到任何答案,我将为你提供一个基本的例子:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTemplateColumn Header="Item Collection">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding ItemCollection}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
现在要填写此内容,您需要一组对象,每个对象都具有Name
属性和Items
集合属性:
public class Item : INotifyPropertyChanged // implement this interface properly
{
public string Name { get; set; }
public ObservableCollection<SomeType> ItemCollection { get; set; }
}
在视图模型或后面的代码中:
public ObservableCollection<Item> Items { get; set; }
至于使用Items
对象填充Item
集合,有几种方法可以实现此目的。您基本上需要在SQL
查询或LinQ
查询中加入多个表。您可以在一次传递中执行此操作,或者首先获取名称,然后迭代集合,然后将内部项添加到ItemCollection
属性中......无论您感觉何在。
更新&gt;&gt;&gt;
您完全需要我在示例中添加的内容... 每个都具有某种类型的集合属性的数据对象的集合。请注意如何填充内部集合...进行测试,您可以执行以下操作:
Items.Add(new Item() { Name = "Bob", Items = new ObservableCollection<SomeType>() {
new SomeType() { Something = "One" }, new SomeType() { Something = "Two" },
new SomeType() { Something = "Three" } } } );
Items.Add(new Item() { Name = "Jane", Items = new ObservableCollection<SomeType>() {
new SomeType() { Something = "A" }, new SomeType() { Something = "B" },
new SomeType() { Something = "C" } } } );
否则,您可以这样做:
Items = new ObservableCollection<Item>();
foreach (string value in values)
{
Item item = new Item() { Name = value };
foreach (SomeType someType in SomeTypes.Where(s => s.Something == value))
{
item.ItemCollection.Add(someType);
}
Items.Add(item);
}