2013-10-31 43 views
0

有人可以请我指出正确的方向吗?DataGrid中的列表框

我有一个datagrid通过sqlite查询返回多行。在每一行中,我需要一个列表框,它应该返回与该行关联的多个项目。我将数据网格中父表的引用ID作为列返回,但似乎找不到解决方案来返回列表框中的子记录。

我想我需要通过“DataGridTemplateColumn”或其他什么来做到这一点。

问题1:我怎么会通过SQL迭代呈现在后面的代码或任何其他方法

图形表示的什么,我需要与孩子列表框项目的DataGrid行:这将如何在XAML 问题2被结构化

注:每个列表框需要是可以编辑的

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

Hmmmm,只是碰到这种凸轮张贴... http://stackoverflow.com/questions/16645014/binding-collection-listbox-datagrid?rq=1,并会看到如果这对我的作品... –

+0

...不完全是我在找什么。 ..使用列表框的原因是能够通过列表框将列表项目编辑为列表框方法。 –

+0

听起来对我来说就像你必须在代码中创建它们,并将它们绑定到XAML上 – Noctis

回答

0

正如你尚未有任何答案,我会为你提供一个基本的例子:

<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; } 

作为用Item OBJ填充Items收集有几种方法可以实现这一点。您基本上需要加入多个表格,可以使用SQL查询或LinQ查询。你可以一次完成,或者先获取名字,然后遍历集合,然后将内部物品添加到属性中,无论你感到舒服。


UPDATE >>>

你需要什么,我把例子...数据对象的集合是每有某种类型的集合属性。只是要小心你如何填充内收藏...进行测试,你可以做这样的事情:

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); 
} 
+0

嗨谢里登...感谢您的输入以上...我已经如上所述执行,并卡在最后一位。我已经创建了一个视图来组合我的表格等。关于遍历sql结果的结构是什么? (希望一次完成) –

+0

这一切都取决于您的数据结构。在我对[数据实体>域对象>视图模型,每个数据结构截然不同的数据实体>答案中使用LinQ2SQL'的例子有一个例子(http://stackoverflow.com/questions/19693682/data-entities -domain-objects-viewmodels-each-with-drastically-different-dat/19694623#comment29312293_19694623)post。 – Sheridan

+0

嗨Sheridan ...我想我正在做一些事情...这是我做的..请帮助,如果你可以...将张贴代码上面的问题 –