asp.net - Enlazando una DropDownList en ListView InsertItemTemplate lanzando un error
linq-to-sql data-binding (7)
Eche un vistazo a este hilo http://forums.asp.net/t/1187425.aspx
Básicamente, no puede usar la sintaxis Bind porque los controles dentro de InsertItemTemplate son "de una sola dirección". Usa el código para obtener los valores.
Tengo un ListView que se une a un LinqDataSource y muestra las ubicaciones seleccionadas. El elemento de inserción contiene una lista desplegable que extrae de otro LinqDataSource para dar todas las ubicaciones no seleccionadas.
El problema es que recibo el siguiente error al cargar la página:
Los métodos de enlace de datos como Eval (), XPath () y Bind () solo se pueden usar en el contexto de un control de datos.
Estoy haciendo una configuración muy similar en otra página del sitio web, y no nos está dando este error, así que estoy bastante confundido. Sé que puedo evitar esto al no ser vinculante, encontrar el control manualmente y obtener el valor, pero esto debería funcionar y no entiendo por qué no lo es.
¿Alguna idea?
La mejor parte del código fuente está debajo.
<asp:LinqDataSource ID="ldsLocations" runat="server"
ContextTypeName="ClearviewInterface.ESLinqDataContext" EnableDelete="true" EnableInsert="true"
OnInserting="ldsLocations_Inserting" OnDeleting="ldsLocations_Deleting"
TableName="crmLocations" OrderBy="addr1" OnSelecting="ldsLocations_Selecting" />
<asp:LinqDataSource ID="ldsFreeLocations" runat="server"
ContextTypeName="ClearviewInterface.ESLinqDataContext" OrderBy="addr1"
TableName="v_CVLocations" OnSelecting="ldsFreeLocations_Selecting" />
<asp:ListView ID="lvLocations" DataSourceID="ldsLocations" DataKeyNames="ID" InsertItemPosition="LastItem" runat="server" >
<InsertItemTemplate>
<tr>
<td colspan="6"><hr /></td>
</tr>
<tr>
<td colspan="2">
<asp:DropDownList ID="ddlFreeLocations" DataSourceID="ldsFreeLocations" DataTextField="addr1"
DataValueField="record" MarkFirstMatch="true" SelectedValue=''<%# Bind("record") %>''
runat="server" />
</td>
<td><asp:ImageButton ID="btnAdd" CommandName="Insert" SkinID="Insert" runat="server" /></td>
</tr>
</InsertItemTemplate>
He tenido un problema similar. Intenta usar #Eval en lugar de si no estás actualizando el valor de ese campo.
Con #Eval, puede valer la pena utilizar DataBinder.Eval () para garantizar que la vinculación se realice en el momento correcto.
Lo he logrado. Tengo una vista de formulario con un SqlDataSource y en la vista de formulario hay una lista desplegable con un SQLdataSource.
Cuando se solicita un nuevo registro, vuelvo a emitir los comandos de selección para ambos orígenes de datos: el origen de la lista desplegable proporciona una lista de opciones, mientras que el origen de datos del formulario no arroja nada.
Luego uso DataBind () tanto en la vista de formulario como en la lista desplegable y todo está bien.
Soy nuevo en ASP.Net pero esto funciona para mí y me permite hacer lo que quiero: use Bind en la lista desplegable y los cuadros de texto en el formulario.
Espero que esto ayude a Nathan
Para tal escenario, podemos considerar las siguientes resoluciones:
Para controles internos anidados, en lugar de enlace de datos, utilizamos otros métodos para poblar sus elementos. Por ejemplo, podemos usar un ciclo for para agregar elementos a la lista desplegable en lugar de enlazar datos. Por lo tanto, la expresión <% # ...%> no se evaluará.
También podemos realizar cambios en el contenedor Control de Vista de Detalles. En lugar de la expresión <% #%>, podemos usar manualmente algún evento como "RowDataBound" para completar el elemento de datos en el control interno determinado. Y cuando realice la actualización / inserción, extraiga manualmente los valores de los controles en el evento apropiado (como ItemUpdating o ItemInserting ...).
esto funcionará
protected void lstCompContctPerson_ItemCreated(object sender, RadListViewItemEventArgs e)
{
if ((e.Item != null) && (e.Item.ItemType == RadListViewItemType.InsertItem))
{
System.Web.UI.Control ddlCompNames = e.Item.FindControl("ddlCompNames");
(ddlCompNames as RadDropDownList).DataSource = (from _company in objshortcut.GetAllCompanies()
select new
{
CompanyID = _company.CompanyID,
CompContctName = _company.CompanyName
}).Distinct();
}
}
Como se explica en el blog de Joteke, aquí hay una solución citada.
¿Estás utilizando la expresión
<%#Eval("field")%>
para vincular el control? Si cambia eso a<%#DataBinder.Eval(Container.DataItem,"field")%>
, ¿eso parece arreglar el error?