質問

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

<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 が DataList を使用して提案したのと同じようなことをしましたが、しばらく経ち (2 年以上)、この方法で実行することを完全に忘れていました。そうだ、明らかなことを見落とすことについて話してください。。。

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

Euro Micelli、私はデータベースへの往復旅行を避けようとしていた。私は開発業界の他の人々と比較するとまだ少しグリーンなほうなので、データベース トリップの回数が「適切」であるかどうかを必ずしも十分に把握しているわけではないことを認めます。ここでパフォーマンスの問題は発生しません (私はアプリの負荷を十分に知っているので、これを知っています) が、私の上司は可能な限り出張を減らすことを重視する傾向があるため、習慣でそれを避けようとしていたのだと思います。

役に立ちましたか?

解決

思いつきでは、次のようなことを試すことができます。

<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 が追加されますが、コントロールを見つけやすくなります。

他のヒント

表形式のデータを操作しているため、GridView コントロールを使用することをお勧めします。これで、個々のセルにアクセスできるようになります。

それ以外の場合は、Field1 と Field4 の td を次のように設定できます。 runat="server" そしてIDを教えてください。次に、コードビハインドで、 InnerText 各TDのプロパティ。

生成時にもう少しオーバーヘッドを許容できる場合は、DataList を選択し、必要なデータ フィールドを保存する DataKeys プロパティを使用します。

テーブルの各セルでラベルを使用し、e.Item.FindControl("LabelID") で項目を参照することもできます。

<%#DataBinder.Eval(...) %> メカニズムは、「厳密な」意味ではデータ バインディングではありません。これは、テンプレート内の特定の場所にテキストを配置する一方向の手法です。

データを元に戻す必要がある場合は、次のいずれかを行う必要があります。

  1. ソースデータから取得する
  2. リピーターに別のメカニズムを実装する

リピーターはポストバック間でデータソースを保存しないことに注意してください。後でデータを提供するようにリピーターに要求することはできません。

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

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

@peacedog:

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

データベースの往復に関するトリック:もちろん無料ではありませんが、Web サーバーはデータベースに非常に「近い」 (高速、低遅延の接続) 傾向にありますが、ユーザーはおそらく「遠い」 (低速、高遅延の接続) ところにあります。

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

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

幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top