簡體   English   中英

使用選定的值(隱藏列)填充數據庫的下拉列表

[英]Populating a dropdown from the database with a selected value (hidden column)

我有一個控件正在不同的頁面上使用,但是在一個特定的頁面上,我出現了一個下拉菜單,允許用戶更改數據庫中的某個字段。 下拉菜單有兩個項目(“出勤日”和“非出勤日”),我希望在訪問控件時加載數據庫中的任何選項。

這是我的網格視圖的頂部:

<asp:GridView runat="server" DataSourceID="sdsLookups" ID="gvValues" 
AutoGenerateColumns="False" Width="760px" OnDataBound ="GridView_DataBound">

這是“網格視圖”中的實際下拉列表。 在正確的頁面上,從數據庫中加載了正確的值:

<asp:TemplateField HeaderText="Is Attendance?">
    <ItemTemplate>
        <asp:DropDownList id="ddlAttendanceStatus"  AutoPostBack="True" runat ="server" SelectedValue='<%# Eval("rules") %>' >
            <asp:ListItem>Attendance Day</asp:ListItem>
            <asp:ListItem>Not Attendance Day</asp:ListItem>
        </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField>

這是我當前用於隱藏列的代碼。 我還試圖檢查該項目是否為空,但是我還沒有開始工作:

protected void GridView_DataBound(object sender, EventArgs e)
{
    if (this.LookupType == "Day Status" ? true : false)
    {
        gvValues.Columns[12].Visible = true;
        GridViewRow row = (sender as Control).Parent.Parent as GridViewRow;
        DropDownList rules = (row.FindControl("ddlAttendanceStatus") as DropDownList);
        ListItem item = rules.Items.FindByText("Attendance Day");
        if (item != null)
            rules.Items.FindByText("Attendance Day").Selected = true;
    }
}

當前,該列僅顯示在正確的頁面上,但是當我轉到使用此控件的其他頁面時,出現錯誤消息:

ArgumentOutOfRangeException: 'ddlAttendanceStatus' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value

我知道為什么會收到此錯誤,但是我不確定如何解決此問題。 如果我不在正確的頁面上,是否可以完全忽略此字段? 還是我應該走另一條路?

如果需要發布更多信息,請告訴我。

先感謝您。

問題是aspx頁面上的這段代碼: SelectedValue='<%# Eval("rules") %>' 在其他頁面中,如果不存在rulesrules的值不是“ Attendance Day或“ Not Attendance Day ,則將收到該錯誤。 您可以通過在OnRowDataBound事件中設置SelectedValue來解決此問題。

首先將aspx上的GridView更改為

<asp:GridView runat="server" DataSourceID="sdsLookups" ID="gvValues" 
    AutoGenerateColumns="False" Width="760px" OnDataBound="GridView_DataBound" 
    OnRowDataBound="gvValues_RowDataBound">

然后在后面的代碼中

protected void gvValues_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //check if the row is a datarow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //cast the row back to a datarowview
        DataRowView row = e.Row.DataItem as DataRowView;

        //find the dropdownlist with findcontrol
        DropDownList rules = e.Row.FindControl("ddlAttendanceStatus") as DropDownList;

        if (row["myColumn"].ToString() == "Day Status")
        {
            //set the correct selectedvalue
            rules.SelectedValue = "Not Attendance Day";

            //or
            rules.SelectedValue = "1";
        }
    }
}

最后,作為一種選擇,我建議您將鍵/值用作ListItems。 這使得處理長字符串更加容易。

<asp:DropDownList ID="ddlAttendanceStatus" AutoPostBack="True" runat="server">
    <asp:ListItem Text="Attendance Day" Value="0"></asp:ListItem>
    <asp:ListItem Text="Not Attendance Day" Value="1"></asp:ListItem>
</asp:DropDownList>

更新

首先從GridView本身刪除DataSourceID ,然后將其移動到后面的代碼中。

if (!Page.IsPostBack)
{
    GridView1.DataSource = yourSource;
    GridView1.DataBind();
}

並且您在DropDownList上將AutoPostBack設置為True,但似乎不處理PostBack。 如果沒有任何反應,請嘗試將其刪除。 有關在Grid中編輯和更新數據的信息,請看一下本教程 它涵蓋了所有基礎知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM