DataGrid中的列表框

时间:2013-10-31 03:00:28

标签: c# wpf

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

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

1 个答案:

答案 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);
}