asp.net - validacion - ¿Cómo puedo vincular los datos a una lista desplegable en una vista de cuadrícula desde una tabla de base de datos usando VB?
validacion de datos en excel lista desplegable (4)
En el mundo de las formas de inversión, extraigo mis objetos de la base de datos en una lista (de lo que sea) y utilizo la lista como fuente de datos.
Esto también me permite agregar campos adicionales de "conveniencia" en el objeto para que pueda poblarlo con cosas de otras tablas.
No conozco asp.net, así que si puedes hacer algo similar, podría ser útil.
Por lo tanto, en esta vista de cuadrícula, hay una columna para el estado y quiero tener una lista desplegable con Pase, Pendiente, Fallo aparecer cuando se hace clic en el botón editar. Estos valores ya están en una tabla, por lo que debo enlazar de alguna forma desde esta tabla a cada ddl para cada fila.
Aquí está la columna de gridview. Como puede ver, me gustaría tener una etiqueta que se muestra cuando no está en modo de edición, y una ddl cuando se presiona el botón de edición
<asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus">
<EditItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="Name"
datatextfield="Name" DataSource="*What goes here?*"> />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblStatus" runat="server"
Text=''I don''t understand how to get this from the ddl'' />
</ItemTemplate>
</asp:TemplateField>
En aras de la claridad, mi tabla se llama Status y la base de datos se llama DirectImport.
Una solución realmente rápida es crear un control web personalizado para el menú desplegable de estado. El control siempre contendrá los mismos datos. Cuando lo hace poblar el origen de datos. Cuando se agrega a la vista de cuadrícula, los datos estarán en el menú desplegable. ¡Espero que ayude!
Hay algunos pasos por seguir aquí, ninguno de ellos es particularmente difícil, pero pueden ser un poco difíciles (en mi humilde opinión). La buena noticia es que una vez que hayas hecho que esto funcione una vez, ¡será más fácil hacerlo de nuevo!
Supongo que tiene un control <asp:*DataSource>
en su página. Mi preferencia es un ObjectDataSource pero no creo que importe, creo que un SqlDataSource funciona igual de bien. Nunca he intentado hacer esto con GridView.DataSource = MyDataSet
en código subyacente, así que no sé si funcionaría o no, pero mi hipótesis es que no sería así, ya que no obtendría los dos adecuados. manera vinculante que desee. Esta fuente de datos alimenta su red con sus datos principales. El punto clave aquí es que su consulta de base de datos debe devolver tanto el campo de texto de Estado como el de Estado.
Entonces su gridview ahora se verá algo así como:
<asp:objectdatasource runat="server" id="MainDataSource" ... />
<asp:gridview runat="server" id="MyGridView" DataSourceID="MainDataSource">
<Columns>
<asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus">
<ItemTemplate>
<asp:Label ID="lblStatus" runat="server"
Text="<%# Bind(''Status'') %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:gridview>
El Text="<%# Bind(''Status'') %>"
es el bit que falta para obtener el texto de estado en la grilla.
Ahora agregue una segunda fuente de datos en su marcado que se lee en el conjunto de valores de la tabla de estado.
<asp:objectdatasource runat="server" id="StatusObjectDataSource" ... />
Y agregue EditItemTemplate en GridView, que está vinculado a Status DataSource.
<EditItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="StatusID"
datatextfield="Status" DataSourceID="StatusObjectDataSource"
SelectedValue="<%# Bind(''StatusId'') %>" />
</EditItemTemplate>
El SelectedValue="<%# Bind(''StatusId'') %>"
es lo que conecta los dos datasets para que cuando se voltea una fila en el modo Edit, la lista desplegable tenga el elemento correcto ya seleccionado, y cuando lo guarde Tengo el ID de estado para poner en su base de datos.
Y tu estas listo.
He utilizado el evento RowDataBound. Aquí hay un pequeño fragmento de código. HTH
tendrías una ItemTemplate en tu aspx / ascx
<asp:TemplateField HeaderText="Column Headings">
<ItemTemplate>
<asp:DropDownList ID="ddlName" runat="server" Width="150"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
y en tu código detrás, tendrás
protected void grdDataMap_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList ddl = (DropDownList)e.Row.FindControl("ddlName");
ddl.DataSource = someList;//the source of your dropdown
ddl.DataBind();
}
}
así que cuando unes tu grilla con grdDataMap.Databind (asumiendo que tu grilla id es grdDataMap), se invocará el evento rowbound de cada fila (incluyendo encabezado / pie de página, y esa es la razón por la que verifica RowType)
por lo que probablemente pueda decidir qué controles / columnas ocultar / mostrar / vincular dentro de este evento de fila de datos enlazados