2013-10-31 41 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 ...我想我正在做一些事情...這是我做的..請幫助,如果你可以...將張貼代碼上面的問題 –