在asp.net数据绑定中迭代

时间:2009-11-20 19:10:40

标签: c# asp.net

在我的代码背后说我有一个这样的数组:

public static string [] fields = new string [] {“field1”,“field2”,“field3”,“field4”};

我想使用这个数组在数据绑定时检索gridview中的字段,如下所示:

<%# Eval("Field1")%>
<%# Eval("Field2")%>
<%# Eval("Field3")%>
<%# Eval("Field4")%>

但是,我很难弄清楚如何迭代我的数组(字段)来生成上面的代码。它不想解析数据绑定服务器标记(&lt;%#%&gt;)中的任何运算符,如下所示:

<%# foreach (string field in fields)
    {
       Eval(field);
    }
%>

我找不到在常规服务器标签中重现数据绑定行为的方法:

<% foreach (string field in fields)
    {
       Response.Write(DataBinder.Eval(object, field);
    }
%>

databinder.eval方法接受一个容器对象,我不确定我可以在常规数据绑定标记之外访问它。我也尝试使用常规服务器标签来生成围绕数据绑定代码的迭代代码,但它无法访问迭代的变量。

修改

我应该更清楚,最后我希望值最终会出现在我的页面上,而不是字段名称本身。我的数据库可能类似于:

Field1 | Field2 | Field3 | Field4
       |        |        |
value1 | value2 | value3 | value4

什么时候说完了,我的页面应该是这样的:

value1
value2
value3
value4

但是fields数组是动态的,并且可能因对象而异,因此静态访问数组中的每个索引都不起作用。

2 个答案:

答案 0 :(得分:1)

基于编辑:

<强>标记:

<asp:Repeater id="Repeater1" runat="server">  
    <ItemTemplate>
        <%# GetIndexedItem(DataBinder.Eval(Container.DataItem)) %>
        <!--or--->
        <%# GetIndexedItem(DataBinder.Eval(Container.DataItem), 0) %>
        <%# GetIndexedItem(DataBinder.Eval(Container.DataItem), 1) %>
        <%# GetIndexedItem(DataBinder.Eval(Container.DataItem), 2) %>
    </ItemTemplate>
</asp:Repeater>

<强>代码隐藏:

void Page_Load(Object Sender, EventArgs e) {
  if (!IsPostBack) 
  {         
     Repeater1.DataSource = fields ;
     Repeater1.DataBind();    

  }
}

protected string GetIndexedItem(object obj, int idx)
{
    //add some array bounds checking..etc
    //if you need to loop through the array and return something
    //you can do that here instead of getting by index
    return obj[idx].ToString();       

}

protected string GetIndexedItem(object obj)
{ 
    StringBuilder sb = new StringBuilder();
    string[] lst = (string[])obj;
    for(int i=0;i<lst.Length; i++)
    {
        //something like this
        sb.Append(lst[i].ToString() + "<br>" )
    }
    return sb.ToString() ;       

}

答案 1 :(得分:1)

我已经找到了一个解决方案,我已经根据我到目前为止的回复进行了修补。

诀窍是将容器实例传递给静态方法,以便我可以进行迭代。原始数据绑定服务器控件(&lt;%#%&gt;)不允许运算符,但您可以简单地将容器传递给静态方法来执行此操作。

<强>标记:

<%# GetItems(Container) %>

代码背后:

protected static string GetItems(IDataItemContainer container)
{
    StringBuilder sb = new StringBuilder();
    string[] StaticSQLFields = MyStaticClass.StaticSQLFields;
    for (int i = 0; i < StaticSQLFields.Length; i++)
    {
        sb.Append(DataBinder.Eval(container.DataItem, StaticSQLFields[i]) + "<br>");
    }
    return sb.ToString();
}