4

这是一个 ASP.Net 2.0 网络应用程序。Item 模板如下所示,供参考:

<ItemTemplate>
  <tr>
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td>
  </tr>
</ItemTemplate>

在代码隐藏中使用它:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text;
    Trace.Write(val);
}

我制作这个:

<tr>
  <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
  <td class="class1">23</td>
  <td class="class1">1/1/2000</td>
  <td class="class1">-2</td>
  <td class="class1">11</td>
</tr>

我需要的是来自 Field1 和 Field4 的数据

我似乎无法以 DataList 或 GridView 的方式获取数据,而且我似乎无法在 Google 上提出任何其他内容或快速利用这个来做我想做的事。我能看到获取数据的唯一方法是使用正则表达式来获取它(因为一个人拿走了他想要的东西。他拿走了一切。我是男人,不是吗?Aren不是吗?)。

我是否走在正确的轨道上(不是在寻找特定的正则表达式来执行此操作;伪造这可能是一个后续问题;)),还是我错过了什么?


在这种情况下,中继器是一成不变的,所以我无法切换到更优雅的东西。曾几何时,我做了一些类似于 Alison Zhou 建议使用 DataLists 的事情,但已经有一段时间了(2 年多),我完全忘记了这样做。是的,谈论忽略一些明显的东西。. .

所以我按照艾莉森的建议做了,效果很好。我不认为这里的视图状态是一个问题,即使这个转发器可以获得几十行。如果这样做与使用相反,我真的无法回答这个问题(但这对我来说似乎是一个很好的解决方案)。显然后者不是一个视图状态足迹,但我没有足够的经验来说明什么时候一种方法可能比另一种方法更可取,而我面前没有一个极端的例子。艾莉森,一个问题:为什么是文字而不是标签?

Euro Micelli,我试图避免返回数据库。由于相对于开发世界的其他人来说,我仍然有点陌生,我承认我不一定很好地掌握有多少数据库旅行是“恰到好处”的。这里不会有性能问题(我知道应用程序的负载足以知道这一点),但我想我是出于习惯试图避免它,因为我的老板倾向于尽可能减少旅行。

4

5 回答 5

6

在我的脑海中,你可以尝试这样的事情:

<ItemTemplate>
  <tr>
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td>
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td>
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td>
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td>
  </tr>
</ItemTemplate>

然后,在您后面的代码中,您可以按如下方式访问每个 Literal 控件:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{   
    Literal lit1 = (Literal)item.FindControl("litField1");
    string value1 = lit1.Text;
    Literal lit4 = (Literal)item.FindControl("litField4");
    string value4 = lit4.Text;
}

这将添加到您的 ViewState 中,但它可以很容易地找到您的控件。

于 2008-09-10T17:15:19.223 回答
2

由于您使用的是表格数据,因此我建议您使用 GridView 控件。然后,您将能够访问单个单元格。

否则,您可以将 Field1 和 Field4 的 td 设置为runat="server"并给它们 ID。然后在代码隐藏中,访问InnerText每个 td 的属性。

于 2008-09-10T17:12:55.610 回答
0

如果您可以在生成过程中承担更多开销,请选择 DataList 并使用 DataKeys 属性,这将保存您需要的数据字段。

您还可以在每个表格单元格中使用标签,并能够使用 e.Item.FindControl("LabelID") 引用项目。

于 2008-09-10T17:15:03.127 回答
0

<%#DataBinder.Eval(...) %> 机制不是“严格”意义上的数据绑定。这是一种将文本放在模板中特定位置的单向技术。

如果您需要取回数据,您必须:

  1. 从源数据中获取
  2. 使用不同的机制填充中继器

请注意,Repeater 不会在回发之间保存 DataSource,您不能只要求它稍后再给您数据。

第一种方法通常更容易使用。不要以为从源头重新获取数据太昂贵,除非您通过测量向自己证明;它通常很快。这种技术的最大问题是源数据是否会在调用之间发生变化。

对于第二种方法,一种常见的技术是使用 Literal 控件。有关如何执行此操作的示例,请参阅Alison Zhou的帖子。我个人通常更喜欢在 OnItemDataBound 内填充 Literal 控件

于 2008-09-10T17:41:06.790 回答
0

@和平狗

正确的; 艾莉森的方法是完全可以接受的。

数据库往返的技巧:它们显然不是免费的,但是 Web 服务器往往与数据库非常“接近”(快速、低延迟的连接),而您的用户可能“远离”(缓慢、高延迟的连接)联系)。

因此,通过 cookie、ViewState、隐藏字段或任何其他方法向浏览器发送数据或从浏览器发送数据实际上可能比从数据库中再次读取数据“更糟糕”。还需要牢记安全隐患(“邪恶”用户可以伪造从浏览器返回的数据吗?他们这样做有关系吗?)。

但很多时候它对性能没有任何影响。这就是为什么你应该为你的特定问题做更自然的事情,并且只有在性能开始成为现实问题时才担心它。

祝你好运!

于 2008-09-10T18:23:24.333 回答