2016-10-14 18 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()。 .....)我想我应该检查我的会议或更新面板或其他东西。因为你的代码看起来是正确和合理的。现在感谢:) –