11

Esta pieza de códigoASP: DropDownList en ItemTemplate: ¿Por qué se permite el atributo SelectedValue?

<asp:DropDownList runat="server" ID="testdropdown" SelectedValue="2"> 
    <asp:ListItem Text="1" Value="1"></asp:ListItem> 
    <asp:ListItem Text="2" Value="2"></asp:ListItem> 
    <asp:ListItem Text="3" Value="3"></asp:ListItem> 
</asp:DropDownList> 

produce este error:

The 'SelectedValue' property cannot be set declaratively.

Sin embargo, esto es una plantilla de edición legales y de uso general para GridViews enlace de datos. El atributo SelectedValue ciertamente parece estar establecido declarativamente aquí.

<EditItemTemplate> 
    <asp:DropDownList runat="server" 
     ID="GenreDropDownList" 
     DataSourceID="GenreDataSource" 
     DataValueField="GenreId" 
     DataTextField="Name" 
     SelectedValue='<%# Bind("Genre.GenreId") %>'> 
    </asp:DropDownList> 
</EditItemTemplate> 

La pregunta es: ¿cuál es la diferencia entre los casos en que se le permite configurarlo de forma declarativa y aquellos en los que no está? El mensaje de error implica que nunca está permitido.

Respuesta

6

Significa que no puede configurarlo a través del diseñador.

La forma correcta es:

<asp:DropDownList runat="server" ID="testdropdown"> 
    <asp:ListItem Text="1" Value="1"></asp:ListItem> 
    <asp:ListItem Text="2" Value="2" Selected></asp:ListItem> 
    <asp:ListItem Text="3" Value="3"></asp:ListItem> 
</asp:DropDownList> 

La razón por la que funciona el método vinculado se debe a que el valor no está seleccionado en el modo de diseño, pero en tiempo de ejecución después de que el control está enlazado a un origen de datos

El DropDownList El método .SelectedValue se aplicará en tiempo de ejecución, por lo tanto, el error sobre no poder establecerlo 'decorativamente'

+0

que responda a mi pregunta, si no fuera por la segunda parte de mi pregunta. Claramente, en ciertos casos, se le permite establecer declarativamente SelectedValue, como lo ilustré. Intento entender la diferencia entre los casos en los que está permitido y no. – recursive

+1

Porque en la plantilla gridview aún no ha establecido un valor usando el método bind. El enlace realmente ocurre en tiempo de ejecución. Es como decir "En tiempo de ejecución, cuando enlace datos, seleccione un valor basado en este campo" – Gautam

7

en uso de marcado SelectedValue = '<% # "32"%> sintaxis. (Tenga en cuenta el siguiente ejemplo):

<asp:DropDownList ID="ddlField" SelectedValue='<%# "32" %>' 
    runat="server"  DataTextField="Name" DataValueField="ID" > 
    </asp:DropDownList> 

o en el código subyacente justo después DataBinding (ejemplo):.

ddlField.DataSource = Fields.SelectAll(); 
     ddlField.DataBind();   
     ddlField.SelectedValue = "32"; 
+0

El código de "marcado" no funciona si los elementos se configuran en tiempo de diseño frente a una llamada de enlace de datos para rellenar – NotMe

+0

Gracias, me olvidé del signo #. – Ben

Cuestiones relacionadas