【问题标题】:DataBinding Vs Looping [duplicate]数据绑定与循环[重复]
【发布时间】:2009-07-17 13:53:36
【问题描述】:

可能重复:
Using ASP.NET Controls without databinding

My previous question 产生的结果很少,所以我想我会改写问题并再试一次。

foreach (XXX x in TTTT){ %>
       <tr>
           <td><%=x.val %></td>
               <asp:ImageButton runat="server" CommandName="uiImgResolve_Click"
               CommandArgument='<%=X.pkid%>' ImageUrl="../images/IMG.png"/>
     <% } %>

这不起作用,因为我无法在任何设置了 RUNTAT 属性的控件中设置值。给每一行一个值的最佳方法是什么,所以当点击事件发生时,我可以读取所点击项目的值,我不能将值放在查询字符串上,也不能使用 asp.net 数据绑定。

我正在做的事情比这个复杂得多,数据绑定将不起作用。

也许一个更好的提问方式是无论如何使用上面的循环机制并且仍然保持到控件代码隐藏上的方法的链接?

【问题讨论】:

  • DataBind 会让这一切变得更干净、更容易......你有什么不能使用数据绑定的原因吗?
  • 你给了人们两个小时的时间来回答你上一个问题 - 给我们一个机会!投票结束作为骗子。
  • 投票结束。 @Qiky:如果你想改写你的问题,edit 它。不要创建一个新的。
  • 您需要关闭您的一个问题并等待超过 2 小时才能得到回复。

标签: asp.net data-binding


【解决方案1】:

我建议您查看ASP repeater control。它提供了一个 ItemDatabound 事件,允许您操作动态生成的内容。

【讨论】:

  • 我正在尝试做的事情涉及循环周四并显示多个通用列表。我不会使用数据绑定,因为它只会造成混乱,谢谢您的回答。
【解决方案2】:

将代码混入您的标记确实与 ASP.Net 服务器控件一起工作。有几个更好的选择。这是一个:

标记:

<table>
  <asp:Placeholder id="RowPlaceholder" runat="server" />
</table>

后面的代码:

foreach (MyObject x in TT)
{
   Literal l1 = new Literal();
   l1.Text = string.Format("<tr><td>{0}</td><td>", x.val);

   ImageButton b = new ImageButton();
   b.ImageUrl = "../images/IMG.png";
   b.CommandArgument = x.pkid;
   b.CommandName = "uiImgResolve_Click";  // maybe do this a little differenlty

   Literal l2 = new Literal();
   l2.TExt = "</td></tr>";

   RowPlaceholder.Controls.Add(l1);
   RowPlaceHolder.Controls.Add(b);
   RowPlaceHodler.Controls.Add(l2);

}

【讨论】:

  • 谢谢乔尔,这是第一个有用的答案,而不仅仅是抱怨...您是否建议删除 asp 控件并仅使用 html img?
  • 不,因为您希望它连接到服务器事件。
  • 您最好使用中继器并使用数据绑定 - 可以更简单地查看 html 发生的情况,并且您不必处理动态添加控件所带来的复杂性到页面。
  • @paddy 在这种情况下不起作用
  • 不知道为什么这是 -1 这是唯一接近我正在寻找的答案......
【解决方案3】:

Repeater 甚至 GridView 都可以正常工作。不过需要执行 OnRowCommand 。 绝对像帕迪所说的那样干净。

ASPX

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="val" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ImageButton ID="Button1" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GridView1.DataSource = TTTT;
        GridView1.DataBind();
    }
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;

    XXX x = (XXX)e.Row.DataItem;
    ImageButton btn = (ImageButton)e.Row.FindControl("Button1");
    btn.CommandArgument = x.pkid;
    btn.ImageUrl = "../images/IMG.png";
}

【讨论】:

  • @o.k.w 这不是一个选项,逻辑比显示的要复杂得多,并且需要将多个控件相互嵌入。
  • OWK 我知道你可以很容易地做到这一点,但我正在尝试做的事情涉及循环和显示多个通用列表。我不会使用数据绑定,因为它只会造成混乱,谢谢您的回答。
  • @Qiky 好吧,我想我不会为您的问题的未知复杂性提供答案。
  • 我应该被问到我的问题更好抱歉:)
  • @Qiky 也许您需要像 Joel 建议的那样动态生成控件。棘手的部分是您在页面生命周期的哪个阶段执行此操作。在页面加载时执行此操作,您将无法获得所需的回发行为。我可以继续说下去,但我仍然不完全了解您的详细问题/问题。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2021-01-05
  • 2013-09-19
  • 1970-01-01
  • 2021-10-13
  • 2012-12-24
相关资源
最近更新 更多