0

有人可以为我指出关于上述内容的正确方向吗?

我有一个通过 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);
        }
    }
4

1 回答 1

2

由于您还没有任何答案,我将为您提供一个基本示例:

<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属性中......无论您觉得舒服。


更新>>>

您需要的正是我在示例中放置的内容……一个数据对象的集合,每个对象都具有某种类型的集合属性。请注意如何填充内部集合...对于测试,您可以执行以下操作:

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);
}
于 2013-10-31T10:08:20.890 回答