4

これはASP.Net2.0Webアプリです。参考までに、アイテムテンプレートは次のようになります。

<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で他に何かを思いついたり、これをすばやく活用して自分のやりたいことを実行したりすることもできません。データを取得するために私が見ることができる唯一の方法は、正規表現を使用してデータを取得することです(男性は必要なものを取得するため、すべてを取得します。私は男性ですよね?アレン私ではないですか?)。

私は正しい方向に進んでいますか(これを行うための特定の正規表現を探していません;それはフォローアップの質問かもしれません;))、または私は何かを逃していますか?


この場合のリピーターは石で固定されているので、これ以上エレガントなものに切り替えることはできません。昔々、Alison ZhouがDataListsを使用して提案したのと同じようなことをしましたが、しばらく(2年以上)経ち、この方法でそれを行うことを完全に忘れていました。ええ、明らかな何かを見落とすことについて話してください。。。

だから私はアリソンが提案したようにやった、そしてそれはうまくいく。このリピーターは数十行を取得できますが、ここではビューステートが問題になるとは思いません。代わりにそれを使用するのではなく、そのように実行する場合、私は実際に質問に話すことはできません(しかし、それ以外の場合はそれは私にとっては良い解決策のようです)。明らかに後者はビューステートのフットプリントではありませんが、私の目の前に極端な例がなければ、あるアプローチが別のアプローチよりも好ましい場合があると言うのに十分な経験はありません。アリソン、1つの質問:なぜラベルではなくリテラルなのか?

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>

次に、コードビハインドで、次のように各リテラルコントロールにアクセスできます。

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 を保存しないことに注意してください。後でデータを提供するように要求することはできません。

通常、最初の方法の方が作業が簡単です。測定して自分で証明しない限り、ソースからデータを再取得するのは費用がかかりすぎると思い込まないでください。通常はかなり高速です。この手法の最大の問題は、ソース データが呼び出し間で変更される可能性がある場合です。

2 番目の方法の一般的な手法は、リテラル コントロールを使用することです。方法の例については、 Alison Zhouの投稿を参照してください。私は通常、代わりに OnItemDataBound 内のリテラル コントロールを埋めることを個人的に好みます。

于 2008-09-10T17:41:06.790 に答える
0

@ピースドッグ

正しい; アリソンの方法は完全に受け入れられます。

データベース ラウンドトリップの秘訣: それらは明らかに無料ではありませんが、Web サーバーはデータベースに非常に「近い」(高速で低遅延の接続) 傾向があるのに対し、ユーザーはおそらく「遠く」(低速で高遅延の接続) です。繋がり)。

そのため、Cookie、ViewState、隠しフィールド、またはその他の方法を介してブラウザーとの間でデータを送受信することは、データベースから再度読み取るよりも実際には「悪い」場合があります。心に留めておくべきセキュリティ上の影響もあります (「悪意のある」ユーザーは、ブラウザから返されるデータを偽造することができますか? 偽造してもかまいませんか?)。

しかし、多くの場合、パフォーマンスに違いはありません。そのため、特定の問題に対してより自然に機能することを行い、パフォーマンスが現実の問題になり始めた場合にのみ心配する必要があります。

幸運を!

于 2008-09-10T18:23:24.333 に答える