簡體   English   中英

在 asp.net c# 中單擊按鈕時無法獲取下拉列表選擇的值

[英]Not able to get the dropdown list selected value on button click in asp.net c#

我寫了一個簡單的 asp.net c# 代碼來獲取下拉列表的值。 但即使在選擇了一些值之后,我總是將值設為"--Select Vendor--"

這是代碼。

<asp:DropDownList ID="ddlVendorUploadData" runat="server" CssClass="form-control">
                                        </asp:DropDownList>
                                        <label>Vendor Name</label>

和后面的代碼。

protected void btnUploadData_Click(object sender, EventArgs e)
    {
        try
        {
            string strUserRole = ddlVendorUploadData.SelectedItem.Value;
        }
   }

按鈕點擊代碼是

<asp:Button ID="btnUploadData" runat="server" class="btn btn-danger button" Text="Submit"
                                            OnClick="btnUploadData_Click" OnClientClick="return ValidateDropdownlist();" />

您沒有顯示填充下拉列表的代碼。 但是,這通常是由於您重新加載下拉列表而發生的。

總是,但總是把你的第一個 forms 加載代碼放在 IsPostBack = false 中。

任何回發,任何按鈕單擊都將始終再次運行頁面加載事件,並且每次都這樣做。

我真的希望存在一個名為 FirstPageLoad 的單獨事件。

所以,假設這個標記:

        <asp:DropDownList ID="DropDownList1" runat="server" Width="164px"
            DataValueField="ID"
            DataTextField="HotelName" >
        </asp:DropDownList>

        <asp:Button ID="cmdTest" runat="server" Text="Test drop select value" OnClick="cmdTest_Click" 
            style="margin-left:35px"/>

請注意,我們有兩個值。 第一列是hotels表的隱藏pk“ID”。 然后我們有 HotelName 的“顯示”值。

因此,請確保您只加載數據源超過一次。 如果您每次都重新加載,那么即使單擊按鈕,頁面加載事件也會觸發,並且您的代碼會重新加載下拉菜單,並且在重新加載時您會丟失選擇。

因此,頁面加載代碼應如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadCombo();
    }

    void LoadCombo()
    {
        string strSQL = 
            @"SELECT ID, HotelName FROM tblHotelsA ORDER BY HotelName";
        DropDownList1.DataSource = MyRst(strSQL);
        DropDownList1.DataBind();
        DropDownList1.Items.Insert(0, new ListItem("Select", ""));
    }

請注意非常重要的 IsPostBack 測試/檢查。 由於頁面加載在每次回發時運行(例如,任何按鈕單擊),所以我們需要一個真正的首頁加載,我們在其中加載控件、網格並執行我們真正的頁面加載工作和設置。

因此,使用 IsPostBack 測試。

MyRst 只是一個方便的幫助程序,它返回一個數據表——我在我的應用程序中一遍又一遍地使用它。

該代碼是這樣的:

    public DataTable MyRst(string strSQL)
    {
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                cmdSQL.Connection.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }

因此,當我們運行時,我們會得到:

在此處輸入圖像描述

所以,在 select 之后,我們有這個測試按鈕代碼:

    protected void cmdTest_Click(object sender, EventArgs e)
    {
        Debug.Print("Text property = " + DropDownList1.Text);

        // best to use this MUCH LESS confusing

        Debug.Print("Value property = " + DropDownList1.SelectedItem.Value);
        Debug.Print("Text property = " + DropDownList1.SelectedItem.Text);

    }

我喜歡總是使用 SelectedItem,然后獲取 Text 值(顯示)或隱藏的 Value 屬性(ID)。 請注意,如果您的 drop 沒有兩個值? 然后我建議將 DataValue 和 DataText 都設置為一個列名。

Output:

在此處輸入圖像描述

請注意文本屬性如何實際返回“值”設置。 您還可以使用

DropDownList1.Text = "16"

它會跳轉到並顯示文本值

因此,我們經常需要 select 部分或說酒店如上所述,但我們想獲得/擁有/使用/使用 PK 或隱藏列。

因此,請記住下拉菜單的 2 列功能。

並記住頁面加載事件 - 您需要將組合加載代碼放在 IsPostBack = false 存根中,否則您在每次回發時重新加載下拉每次時間(例如每個按鈕單擊)。

如前所述,為了避免混淆,我總是使用 SelectedItem.Text 或 SelectedItem.Value,這樣可以減少這里的混亂。

首先,我知道這是不好的做法,但我沒有足夠的聲譽來發表評論,所以我不知道如何在沒有回答的情況下提出這個問題?

如果我們可以看到生成下拉數據的代碼,這將更容易回答。 但據我所知,可能存在三個問題:

  1. 考慮到下拉項具有 Text="" 和 Value="" 屬性,您是否有機會混合 SelectItem.Value 和 SelectedItem.Text。
  2. 它可以幫助將下拉列表的 DataValueField 屬性設置為“Value”( .DataValueField = "Value"; ) - 再次假設它是您想要的 Value 屬性數據。
  3. 我的最后一個想法可能是下拉 ViewState 設置不正確。 如果 viewstate 為 false,可能會導致更新問題。

希望這些建議中的任何一個都可以幫助您解決問題。

暫無
暫無

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

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