如何在detailsview中绑定下拉列表的选定值

本文关键字:下拉列表 绑定 detailsview | 更新日期: 2023-09-27 18:12:12

我在detailsview控件中有一个下拉列表。数据源是一个带有日期列的SQL表。

<asp:TemplateField HeaderText="Day of Month: ">
            <EditItemTemplate>
                <asp:DropDownList ID="ddlDoM" runat="server" > 
                </asp:DropDownList>
            </EditItemTemplate>
            <InsertItemTemplate>
                <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:TextBox>
            </InsertItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label7" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:Label>
            </ItemTemplate>
            <HeaderStyle Font-Bold="True" />
</asp:TemplateField>

我已经在DataBound事件中用数字1 - 31填充了下拉列表。

protected void DataView1_DataBound(object sender, EventArgs e)
{
    DropDownList ddlDoM = (DropDownList)Page.FindControl("ctl00$formPlaceHolder$DataView1$ddlDoM");
    if (DataView1.CurrentMode == DetailsViewMode.Edit)
    {
        for (int i = 1; i < 32; i++)
        {
            ListItem item = ListItem.FromString(i.ToString());
            ddlDoM.Items.Add(item);
        }
    }
        DataRowView drv = DataView1.DataItem as DataRowView;
        ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString()));
    }
}

在这里的最后一行中,我将下拉列表的选定值设置为当前数据源值。

ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString()));

如何绑定下拉列表以在更改时更新数据源中的值?我已经尝试将所选值属性设置为<%# Bind("dayofthemonth") %>,但我收到一个OutOfRangeException。我假设在切换到编辑模式时列表还没有填充。

对此有什么想法吗?如果您需要更多代码,请告诉我。

如何在detailsview中绑定下拉列表的选定值

尝试将ControlParameter添加到数据源中的UpdateParameters,并确保您的下拉列表设置为AutoPostBack(如果合适)。你也可以考虑在更早的事件(例如Page_Init)中填充下拉列表,并将其默认值保留到你已经拥有的DataBound事件中。

<asp:SqlDataSource ... UpdateCommand=""....>
    <UpdateParameters>
        <asp:ControlParameter ControlID="ddlDoM" Name="dayofthemonth" PropertyName="SelectedValue" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>

同样,如果它仍然引起问题,一个安全(但冗长)的选择是将listtitems直接添加到下拉列表控件中,因为它们似乎是静态值:

<asp:DropDownList ID="ddlDoM" runat="server" AutoPostBack="true">
    <asp:ListItem Value="1" />
    <asp:ListItem Value="2" />
    <asp:ListItem Value="3" />
    etc...
</asp:DropDownList>