paginar paginacion net example ejemplo con asp asp.net datarepeater

asp.net - paginacion - repeater asp net ejemplo



ASP.NET: ¿Cómo acceder a los elementos de entrada de formulario generados por repetidor? (4)

Aquí hay un código específico sobre cómo manejar el campo oculto:

MARGEN:

<asp:HiddenField ID="repeaterhidden" Value=''<%# DataBinder.Eval(Container.DataItem, "value")%>'' runat="server" >

DO#:

{

HiddenField hiddenField = (HiddenField)item.FindControl(repeaterStringhidden); { /* do something with hiddenField.Value */

}

Quiero que un repetidor genere un montón de casillas, por ejemplo:

<tr><td><input type="checkbox" name="t" value="11cbf4deb87" /> <input type="checkbox" name="a" value="33cbf4deb87" />stackoverflow.com</td></tr> <tr><td><input type="checkbox" name="t" value="11cbf4deb88" /> <input type="checkbox" name="a" value="33cbf4deb87" />microsoft.com</td></tr> <tr><td><input type="checkbox" name="t" value="11cd3f33a89" /> <input type="checkbox" name="a" value="33cbf4deb87" />gmail.com</td></tr> <tr><td><input type="checkbox" name="t" value="1138fecd337" /> <input type="checkbox" name="a" value="33cbf4deb87" />youporn.com</td></tr> <tr><td><input type="checkbox" name="t" value="11009efdacc" /> <input type="checkbox" name="a" value="33bf4deb87" />fantasti.cc</td></tr>

Pregunta 1: ¿Cómo hago referencia individualmente a cada casilla cuando el repetidor se está ejecutando para poder establecer el valor único?

¿Lo ato de datos con algo como esto?

<itemtemplate> <tr> <td> <input type="checkbox" name="t" value="<%# ((Item)Container.DataItem).TangoUniquifier %>" /> <input type="checkbox" name="a" value="<%# ((Item)Container.DataItem).AlphaUniquifier %>" /> <%# ((Item)Container.DataItem).SiteName %> </td> </tr> </itemtemplate>

¿O se supone que debo configurarlo en el OnItemDataBound?

<asp:repeater id="ItemsRepeater" OnItemDataBound="ItemsRepeater_OnItemDataBound" runat="server"> ... <itemtemplate> <tr> <td> <input id="chkTango" type="checkbox" name="t" runat="server" /> <input id="chkAlpha" type="checkbox" name="a" runat="server" /> <%# ((Item)Container.DataItem).SiteName %> </td> </tr> </itemtemplate> ... </asp:repeater> protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) { // if the data bound item is an item or alternating item (not the header etc) if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // get the associated item Item item = (Item)e.Item.DataItem; //??? this.chkTango.Value = item.TangoUniquifier; this.chkAlpha.Value = item.AlphaUniquifier; } }

Pero si se supone que debo hacer referencia a él en el código subyacente, ¿cómo lo menciono en el código subyacente? ¿Se supone que debo referenciarlo usando la propiedad de identificación (del lado del servidor) de un control <INPUT> ? me doy cuenta de que la ID de un control en el lado del servidor no es lo mismo que la ID que estará presente en el cliente.

¿O tengo que hacer algo donde tengo que encontrar un control INPUT con un nombre de "t" y otro con un nombre de "a"? ¿Y qué tipo de control es un CheckBox que me permite establecer su valor de entrada?

protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) { // if the data bound item is an item or alternating item (not the header etc) if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // get the associated item Item item = (Item)e.Item.DataItem; CheckBox chkTango = (CheckBox)e.Item.FindControl("chkTango"); chkTango.Value = item.TangoUniquifier; CheckBox chkAlpha = (CheckBox)e.Item.FindControl("chkAlpha"); chkAlpha.Value = item.AlphaUniquifier; } }

Pregunta 2: Cuando el usuario hace clic en ENVIAR, ¿cómo encuentro todas las casillas marcadas, o más específicamente sus VALORES?

¿Tengo que FindControl?

protected void DoStuffWithLinks_Click(object sender, EventArgs e) { // loop through the repeater items foreach (RepeaterItem repeaterItem in actionItemRepeater.Items) { Item item = repeaterItem.DataItem as Item; // grab the checkboxes CheckBox chkAlpha = (CheckBox)repeaterItem.FindControl("chkAlpha"); CheckBox chkTango = (CheckBox)repeaterItem.FindControl("chkTango"); if (chkAlpha.Checked) { item.DoAlphaStuff(chkAlpha.Name); } if (chkTango.Checked) { item.DoTangoStuff(chkTango.Name); } } }

¿Los elementos del repetidor DataItem aún están allí en un controlador de eventos de clic?


Creo que este KB me dio la mejor respuesta:

http://msdn.microsoft.com/en-us/library/1d04y8ss.aspx

Para mi propia falta de suerte, esto parece estar disponible solo para la versión .net 4.0 (y todavía estoy estancado en 3.5 SP1).

Citando (negrita es mía):

Cuando un control se encuentra dentro de un control vinculado a datos que genera instancias repetidas del control, ASP.NET genera valores UniqueID e ClientID para cada instancia del control. El valor UniqueID se genera combinando el valor UniqueID del contenedor de nombres, el valor de ID del control y un número secuencial. Este es el caso en controles como los controles DataList, Repeater , GridView y ListView.

ASP.NET genera valores de ClientID de manera similar cuando la propiedad ClientIDMode está configurada en AutoID. Esto puede hacer que sea difícil hacer referencia al control en el script del cliente, ya que normalmente no puede predecir los valores de los números secuenciales que se utilizan. Si desea acceder a los controles enlazados a datos desde el script del cliente, puede establecer la propiedad ClientIDMode en Predecible. Esto hace que sea más fácil predecir cuáles serán los valores de ClientID.

Cuando configura ClientIDMode en Predictable, también puede establecer la propiedad ClientIDRowSuffixDataKeys en el nombre de un campo de datos único , como la clave principal en una tabla de base de datos. Esto hace que ASP.NET genere una ID de cliente que será más fácil de predecir y hacer referencia en la secuencia de comandos del cliente si puede predecir valores de clave de datos.

Entonces, en la versión 3.5, lo hago usando campos ocultos:

foreach (RepeaterItem item in rptClientes.Items) { Panel pnl = (Panel)item.FindControl("divCliente"); Control c = pnl.FindControl("hdnID"); if (c is HiddenField) { if (((HiddenField)c).Value == hdnClienteNome.Value) pnl.BackColor = System.Drawing.Color.Beige; } }


Es posible que le resulte más fácil utilizar un control CheckBoxList.

En el caso simple, establecería DataTextVield y DataValueField en el nombre y valor extraídos de su fuente de datos (suponiendo que esté rellenando desde un origen de datos) y luego lo vincula para crear los elementos.

Probablemente, menos trabajo de su parte que crear las casillas de verificación en un repetidor.


Use el control del servidor en lugar de hacer un control de entrada runat = server

<asp:CheckBox id="whatever" runat="Server" />

Cuando establece el valor en su ItemDataBound, utiliza FindControl

CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever"); checkBox.Checked = true;

Cuando obtiene los artículos, también usa FindControl del artículo en un constructo foreach. Además, dependiendo de cómo lo haya conectado a datos, es posible que DataItem ya no esté allí después de una devolución de datos.

foreach (RepeaterItem item in myRepeater.Items) { if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) { CheckBox checkBox = (CheckBox)item.FindControl("whatever"); if (checkBox.Checked) { /* do something */ } } }

  • Muchas personas tienen la tentación de ''lanzar de forma segura'' utilizando el operador as con FindControl() . No me gusta porque cuando cambias el nombre del control en el formulario, puedes ignorar silenciosamente un error de desarrollo y dificultar el rastreo. Intento usar solo el operador as si no se garantiza que el control esté allí.

Actualización para: ¿Qué CheckBox es cuál? En el html renderizado terminarás teniendo todos estos nombres de casilla de verificación como

ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox

No le importan cuáles son los nombres porque el elemento foreach.FindControl () los obtiene por usted, y no debe asumir nada sobre ellos. Sin embargo, cuando itera a través de foreach, generalmente necesita una forma de hacer referencia a eso de nuevo. La mayoría de las veces esto se hace teniendo también un control asp: HiddenField junto a cada CheckBox para mantener un identificador que lo haga coincidir con la entidad correcta.

Nota de seguridad : existe un problema de seguridad con el uso de campos ocultos porque un campo oculto puede ser alterado en javascript; Siempre tenga en cuenta que este valor podría haber sido modificado por el usuario antes de enviar el formulario.