2016-10-14 26 views
0

我有嵌套repaters組數據。同一個表中的所有數據都有QUESTION_GROUP列。我在父項目數據綁定中通過父代轉發器爲子代中繼器傳遞組名稱。但我不能將它設置爲兒童中繼器數據源。我怎樣才能從數據表中過濾器中的多個數據DataSource?過濾數據表爲Repeater DataSource(asp.net)

protected void ParentRepeaterDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     Repeater rp = (Repeater)e.Item.FindControl("ChildRepeater");    
     rp.DataSource = FixedQuestions.Select("QUESTION_GROUP='" + DataBinder.Eval(e.Item.DataItem, "Q_Group").ToString() + "'"); 
     rp.DataBind(); 
    } 

Q_Group來自父代中繼器。 QUESTION_GROUP是fixedquestions(DataTable)中的一列。

我在問,我怎樣才能得到數據表的一部分,按列過濾(對於中繼器數據源)?

+0

你是什麼意思,你不能設置數據源?請解釋發生了什麼,一個例外?空的中繼器?什麼是FixedQuestion?沒有足夠的信息來幫助您:http://stackoverflow.com/help/mcve – Esko

+0

@Esko對不起。 FixedQuestion是數據表中的所有數據。我想從它得到一些數據,如「DataTable.Select(Where question_group = Parent Repeater's Data Item)」。我現在有一個錯誤(對象引用沒有設置對象的一個​​實例)。看起來像我的來源是不正確的類型作爲中繼器的數據源。 –

+0

編輯所有這些附加信息到您的問題。什麼行引發異常?是rp null?是FixedQuestions null?仍然沒有足夠的信息來幫助你,我們無法知道那段代碼有什麼問題。 – Esko

回答

0

可以使用Linq過濾表,然後將其綁定到嵌套Repeater。

rp.DataSource = FixedQuestions.AsEnumerable().Where(x => x.Field<string>("columnName") == "myValue").CopyToDataTable(); 

只要過濾後還有剩餘的行,上面的代碼片段就會工作。否則,您將得到一個「源不包含DataRows」錯誤。 在調用CopyToDataTable()之前,下面的代碼片段將檢查是否有任何行。

 DataTable dtFiltered = new DataTable(); 
     var dtFilteredTemp = FixedQuestions.AsEnumerable().Where(X => X.Field<string>("columnName") == "myValue"); 
     if (dtFilteredTemp.AsDataView().Count > 0) 
     { 
      dtFiltered = dtFilteredTemp.CopyToDataTable(); 
     } 
     rp.DataSource = dtFiltered; 
+0

我已經試過你的第一個剪輯,我得到「源不包含DataRows」錯誤。所以我嘗試了第二個,沒有錯誤,但它不能正常工作。 S Ro調試代碼,看到dtFiltered有0行。我不明白。 :/ –

+0

然後你篩選的結果返回0。嘗試過濾保證返回行的值。 – VDWWD

+0

我已經檢查過了:(我認爲我的FixedQuestion表可能會變空,我正在使用會話來獲取它(並且使用你的代碼 - >(DataTable)Session [「FixedQuest」])AsEnumerable()。 .....)我想我應該檢查我的會議或更新面板或其他東西。因爲你的代碼看起來是正確和合理的。現在感謝:) –