문제

이것은 ASP.Net 2.0 웹 앱입니다.참고로 항목 템플릿은 다음과 같습니다.

<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년 이상) 이런 방식으로 수행하는 것을 완전히 잊어버렸습니다.그래, 명백한 것을 간과하는 것에 대해 이야기해라...

그래서 Alison이 제안한 대로 했는데 잘 작동합니다.이 반복기가 수십 개의 행을 얻을 수 있더라도 여기서는 viewstate가 문제라고 생각하지 않습니다.그런 식으로 사용하는 것과 대신에 사용하는 경우에 대한 질문에 대해 실제로 말할 수는 없습니다(그러나 그렇지 않은 경우에는 좋은 해결책인 것 같습니다).분명히 후자는 viewstate 공간이 적지만 내 앞에 극단적인 예가 없으면 어떤 접근 방식이 다른 접근 방식보다 선호될 수 있는지 말할 만큼 경험이 없습니다.앨리슨, 질문 하나:왜 라벨이 아닌 리터럴인가요?

유로 미첼리, 데이터베이스로의 왕복 여행을 피하려고 했습니다.나는 나머지 개발 세계에 비해 아직은 다소 미숙하기 때문에 얼마나 많은 데이터베이스 이동이 "딱 맞는" 것인지 제대로 파악하지 못한다는 점을 인정합니다.여기에는 성능 문제가 없을 것입니다(이 사실을 알 만큼 앱의 부하를 알고 있음). 하지만 상사가 가능한 한 적은 수의 여행을 강조하는 경향이 있기 때문에 습관적으로 이를 피하려고 노력한 것 같습니다.

도움이 되었습니까?

해결책

내 머리 꼭대기에서 다음과 같이 시도해 볼 수 있습니다.

<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에 추가되지만 컨트롤을 쉽게 찾을 수 있습니다.

다른 팁

표 형식 데이터로 작업하고 있으므로 GridView 컨트롤을 사용하는 것이 좋습니다.그러면 개별 셀에 액세스할 수 있습니다.

그렇지 않으면 Field1 및 Field4에 대한 td를 다음으로 설정할 수 있습니다. runat="server" 그리고 그들에게 신분증을 주세요.그런 다음 코드 숨김에서 InnerText 각 td에 대한 속성입니다.

생성 시 약간의 추가 오버헤드를 감당할 수 있는 경우 DataList로 이동하여 DataKeys 속성을 사용하면 필요한 데이터 필드가 저장됩니다.

각 테이블 셀에 레이블을 사용하고 e.Item.FindControl("LabelID")을 사용하여 항목을 참조할 수도 있습니다.

<%#DataBinder.Eval(...) %> 메커니즘은 "엄격한" 의미의 데이터 바인딩이 아닙니다.템플릿의 특정 위치에 텍스트를 넣는 단방향 기술입니다.

데이터를 다시 가져와야 하는 경우 다음 중 하나를 수행해야 합니다.

  1. 소스 데이터에서 가져오기
  2. 다른 메커니즘으로 중계기를 채웁니다.

Repeater는 포스트백 사이에 DataSource를 저장하지 않습니다. 나중에 데이터를 제공하도록 요청할 수는 없습니다.

일반적으로 첫 번째 방법이 작업하기가 더 쉽습니다.측정을 통해 직접 증명하지 않는 한 소스에서 데이터를 다시 얻는 데 비용이 너무 많이 든다고 가정하지 마십시오.일반적으로 꽤 빠릅니다.이 기술의 가장 큰 문제점은 소스 데이터가 호출 간에 변경될 수 있다는 것입니다.

두 번째 방법의 경우 일반적인 기술은 리터럴 컨트롤을 사용하는 것입니다.보다 앨리슨 저우수행 방법에 대한 예를 보려면 님의 게시물을 참조하세요.저는 개인적으로 OnItemDataBound 내부에 리터럴 컨트롤을 채우는 것을 선호합니다.

@평화개:

옳은;앨리슨의 방법은 완벽하게 수용 가능합니다.

데이터베이스 왕복을 이용한 트릭:분명히 무료는 아니지만 웹 서버는 데이터베이스에 매우 "가까운"(빠르고 대기 시간이 짧은 연결) 경향이 있는 반면 사용자는 아마도 "멀리"(느리고 대기 시간이 높은 연결) 있는 경향이 있습니다.

따라서 쿠키, ViewState, 숨겨진 필드 또는 기타 방법을 통해 브라우저와 데이터를 주고받는 것이 실제로 데이터베이스에서 다시 읽는 것보다 "더 나쁠" 수 있습니다.명심해야 할 보안 관련 사항도 있습니다("사악한" 사용자가 브라우저에서 돌아오는 데이터를 위조할 수 있습니까?).그렇게 해도 문제가 될까요?).

하지만 성능에는 별 차이가 없는 경우가 많습니다.그렇기 때문에 특정 문제에 더 자연스럽게 작용하는 일을 하고 그것에 대해서만 걱정해야 합니다. 만약에 성능이 실제 문제가 되기 시작합니다.

행운을 빌어요!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top