Estoy tratando de extraer texto de una fila de Gridview de tipo-
| texto1 | texto1 | EnlaceBotónTexto3 | texto4 |
Utilicé este mismo bloque de código para extraer el texto de cada celda de la fila y no pude obtener el LinkButtonText3
ya que tiene un valor null
para el campo Texto.
for (int i= 0; colIdx < gv.Columns.Count; i++) { dict.Add(arr[i], row.Cells[i].Text); }
Además, traté de formatear la fila Control y cambiar la celda que tiene el control LinkButton, pero no funcionó.
/*formatRow(row in gv.Rows) called this method before the previous for loop executes; */ static void formatRow(Control c) { for (int i = 0; i < c.Controls.Count; i++) { Control curr = c.Controls[i]; if (curr is LinkButton) { c.Controls.Remove(curr); c.Controls.AddAt(i, new LiteralControl((curr as LinkButton).Text)); } } }
Pero esto no funcionó. Estoy tratando de encontrar una manera de formatear LinkButtonCell y acceder a su texto con una referencia consistente a todas las celdas de la fila. ( row.Cells[i].Text
)
No está claro si está buscando un evento de clic o ejecutar código cuando hace clic en el botón de enlace (¿y no estoy seguro de por qué no se usa un botón ASP.NET estándar aquí?).
De todos modos, ¿cómo funciona esto?
Para datos enlazados y predeterminados (columnas generadas automáticamente), esos valores y columnas se colocan en la colección .cells[]
.
Sin embargo, para cualquier control con plantilla, debe usar el control de búsqueda. (y realmente, habría ayudado al menos publicar algunas líneas del marcado de gridview).
En cuanto al formato de la vista de cuadrícula, MUY, pero MUCHO sugiero que use el evento de enlace de datos de fila. Hay más de 100 razones para esto, pero una razón REALMENTE importante es que no solo tiene la fila de vista de cuadrícula, sino que TAMBIÉN tiene la fila de datos utilizada para vincular en ese punto (y eso significa que puede usar columnas de la fuente de datos que son NI siquiera se muestra en la cuadrícula, y, a menudo, esas columnas adicionales son MUY útiles para formatear las columnas/datos que muestra.Y al usar el evento de enlace de datos de fila, tampoco tiene que escribir un bucle adicional para formatear.
De todos modos, asumiendo que su vista de cuadrícula tiene campos con plantilla, diga así:
<asp:TemplateField> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton> </ItemTemplate> </asp:TemplateField>
Entonces, ¿un código de bucle estándar para obtener/usar/tener/cambiar/formatear/jugar/divertirse con el botón de enlace en un bucle de procesamiento para cada fila de la cuadrícula?
Este:
foreach(GridViewRow gvR in GridView1.Rows) { LinkButton lBtn = (LinkButton)gvR.FindControl("LinkButton1"); if (lBtn.Text == "test") { // bla bla bla } }
Entonces, ¿autogenerar columnas o columnas vinculadas a datos? Aparecen en la colección de cells[]
. Sin embargo, los controles estándar, como el cuadro de texto, el botón, el botón de enlace, etc., sin duda se colocan en la cuadrícula como se indica arriba (en un bloque templateField, y se obtienen/usan con findcontrol como se indica arriba).
Haga esto en un evento de clic de botón. Primero obtenemos el remitente del botón
Button YourButtonHere = (Button)sender;
Luego tomamos la fila en la que se hizo clic en el botón.
GridViewRow gvr = (GridViewRow)YourButtonHere.NamingContainer;
Luego hacemos una Etiqueta donde almacenamos la etiqueta de su fila. Puede hacer esto para todas las Etiquetas que tiene en su cuadrícula. Image ID_Label_Item es la etiqueta de su cuadrícula donde tiene el valor que aparece.
Label ID_Label_Item = (Label)gvr.FindControl("ID_Label_Item");
Y con este ID_Label_Item que creó, tiene la información que se encuentra en esa fila específica donde se hace clic en el botón, puede hacerlo con todos los campos de su vista de cuadrícula. Que tengas un buen día. Espero haber sido de ayuda.