Pergunta

Este é um aplicativo da web ASP.Net 2.0.O modelo Item se parece com isto, para referência:

<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>

Usando isso no codebehind:

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

Eu produzo isso:

<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>

O que preciso são os dados do Campo1 e Campo4

Parece que não consigo obter os dados da maneira que faria, digamos, com um DataList ou um GridView, e não consigo encontrar mais nada no Google ou aproveitar rapidamente este para fazer o que quero.A única maneira que vejo de obter os dados é usar uma regex para obtê-los (porque um homem pega o que quer.Ele leva tudo.E eu sou um homem, não sou?Não sou?).

Estou no caminho certo (não estou procurando o regex específico para fazer isso;forjando isso pode ser uma pergunta de acompanhamento;)), ou estou faltando alguma coisa?


O Repetidor, neste caso, é imutável, então não posso mudar para algo mais elegante.Era uma vez eu fiz algo semelhante ao que Alison Zhou sugeriu usar DataLists, mas já faz algum tempo (mais de 2 anos) e esqueci completamente de fazer dessa maneira.Sim, fale sobre ignorar algo óbvio...

Então fiz como Alison sugeriu e funcionou bem.Não acho que o viewstate seja um problema aqui, embora esse repetidor possa obter dezenas de linhas.Eu realmente não posso responder à questão de fazer dessa maneira ou usar o (mas, de outra forma, parece uma boa solução para mim).Obviamente, o último é menos uma pegada viewstate, mas não tenho experiência suficiente para dizer quando uma abordagem pode ser preferível a outra sem um exemplo extremo à minha frente.Alisson, uma pergunta:por que literais e não rótulos?

Euro Micelli, eu estava tentando evitar uma viagem de volta ao banco de dados.Como ainda sou um pouco verde em relação ao resto do mundo do desenvolvimento, admito que não tenho necessariamente uma boa noção de quantas viagens ao banco de dados são "certas".Não haveria um problema de desempenho aqui (conheço a carga do aplicativo o suficiente para saber disso), mas suponho que estava tentando evitá-lo por hábito, já que meu chefe tende a enfatizar menos viagens sempre que possível.

Foi útil?

Solução

Pensando bem, você pode tentar algo assim:

<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>

Então, no seu code-behind, você pode acessar cada controle Literal da seguinte maneira:

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;
}

Isso será adicionado ao seu ViewState, mas facilitará a localização de seus controles.

Outras dicas

Como você está trabalhando com dados tabulares, recomendo usar o controle GridView.Então você poderá acessar células individuais.

Caso contrário, você pode definir os tds para Field1 e Field4 como runat="server" e dê-lhes IDs.Em seguida, no codebehind, acesse o InnerText propriedade para cada td.

Se você puder pagar um pouco mais de sobrecarga na geração, vá para DataList e use a propriedade DataKeys, que salvará os campos de dados necessários.

Você também pode usar rótulos em cada uma das células da tabela e poder referenciar itens com e.Item.FindControl("LabelID").

O mecanismo <%#DataBinder.Eval(...) %> não é Data Binding em um sentido "estrito".É uma técnica unilateral colocar texto em locais específicos do modelo.

Se precisar recuperar os dados, você deverá:

  1. Obtenha-o a partir dos seus dados de origem
  2. Preencha o repetidor com um mecanismo diferente

Observe que o Repetidor não salva o DataSource entre postbacks. Você não pode simplesmente solicitar que ele forneça os dados mais tarde.

O primeiro método geralmente é mais fácil de trabalhar.Não presuma que é muito caro readquirir seus dados da fonte, a menos que você prove isso por meio de medições;geralmente é bem rápido.O maior problema com esta técnica é se os dados de origem podem mudar entre as chamadas.

Para o segundo método, uma técnica comum é usar um controle Literal.Ver Alisson Zhou's post para um exemplo de como fazer isso.Eu normalmente prefiro preencher os controles Literais dentro do OnItemDataBound

@peacedog:

Correto;O método de Alison é perfeitamente aceitável.

O truque com as viagens de ida e volta do banco de dados:eles não são gratuitos, obviamente, mas os servidores web tendem a estar muito "próximos" (conexão rápida e de baixa latência) do banco de dados, enquanto seus usuários provavelmente estão "longe" (conexão lenta e de alta latência).

Por causa disso, enviar dados de/para o navegador por meio de cookies, ViewState, campos ocultos ou qualquer outro método pode ser "pior" do que lê-los novamente em seu banco de dados.Há também implicações de segurança a serem lembradas (um usuário "mau" pode falsificar os dados que retornam do navegador?Importaria se o fizessem?).

Mas muitas vezes isso não faz nenhuma diferença no desempenho.É por isso que você deve fazer o que funciona mais naturalmente para o seu problema específico e se preocupar apenas com isso. se o desempenho começa a ser um problema do mundo real.

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top