【问题标题】:Iteration in asp.net databindingasp.net 数据绑定中的迭代
【发布时间】:2010-12-18 20:41:07
【问题描述】:

假设我在后面的代码中有一个这样的数组:

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

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

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

但是,我很难弄清楚如何遍历我的数组(字段)以生成上述代码。它不想像这样解析数据绑定服务器标签 () 中的任何运算符:

<%# 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

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

【问题讨论】:

  • 我完全误解了这个问题,哦! (而且看起来我不是唯一一个。)所以您想选择哪些字段动态绑定到另一个数据绑定控件?换句话说,您希望您的其他控件现在绑定到字段 1-4,但您希望能够立即更改到字段 5-8?
  • 基本上。程序中的对象有一个抽象级别,在这里被表示,所以我想在这里反映这个抽象。例如,一个对象可能决定使用 field1、field2 和 field3,而另一个对象可能决定使用 field5 和 field6。这就是我想你所说的,唯一的区别是你提到了1-4和5-8,它们是相同数量的字段,在这种情况下我可以写Eval(fields [0]),Eval(fields [1]) 等。不过,它的大小是可变的。
  • 那么您如何确定哪些行显示哪些字段?
  • 这是我要迭代的结果的一部分,属于逻辑类别。返回的结果具有“事件”的概念,我想输出偶数名称以及它是否发生。但是,对象本身是抽象的,并且只包含一个事件列表(其中包含其对应的 sql 字段)。我想遍历它来检查对象的状态。

标签: c# asp.net


【解决方案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() ;       

}

【讨论】:

  • 你能详细说明嵌套对象图部分吗?您提出的解决方案并不能解决我的问题,它只是输出字段本身的字符串。
  • 哦,数组大小可以改变是很重要的 :) 我也会把它放到编辑中。
【解决方案2】:

我已经根据目前收到的回复拼凑出了一个解决方案。

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

标记:

<%# 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();
}

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多