如何在不使用 JavaScript 的情况下对 "dynamic" ASP.NET DropDownList 中的选定项目执行 OnClick

How to do OnClick on selected item in "dynamic" ASP.NET DropDownList without using JavaScript

目前,我的 DropDownList 中有 2 个值,即 viewProduct 和 editProduct。因此,当用户选择其中一个值时,它会将用户定向到 ASP.NET 中的特定功能。我试过 OnSelectedIndexChanged,但似乎无法处理动态 DropDownList。 这是我的代码:

            ddlAction.ID = "ddlForAction";
            ddlAction.CssClass = "ddlList";
            ddlAction.CausesValidation = false;
            ddlAction.AutoPostBack = true;
            ddlAction.Items.Add(new ListItem("View","viewProduct"));
            ddlAction.Items.Add(new ListItem("Edit", "editProduct"));
            e.Row.Cells[5].Controls.Add(ddlAction);
      
            if(ddlAction.SelectedValue == "editProduct")
            {
                editProduct();
            }
            else if(ddlAction.SelectedValue == "viewProduct")
            {
                retrieveProduct();
            }

知道如何在 不使用 的情况下使用 JavaScript 解决它吗? 我的整个代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        BindGridView();
    }

    private void BindGridView()
    {
        MySqlConnection conn = new MySqlConnection(sqlConn);
        string sql = "SELECT prodID, prodName, stockLevel, reorderLevel, unitPrice from Product";
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        productList.DataSource = dt;
        productList.DataBind();
    }

    protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        TableCell tc = new TableCell();
        DropDownList ddlAction = new DropDownList();
        if (e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[0].Text = "Prod ID";
            e.Row.Cells[1].Text = "Product Name";
            e.Row.Cells[2].Text = "Qty";
            e.Row.Cells[3].Text = "Reorder Level";
            e.Row.Cells[4].Text = "Price (RM)";
            e.Row.Controls.Add(tc);
        }
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var qty = Int16.Parse(e.Row.Cells[2].Text);
            var reorder = Int16.Parse(e.Row.Cells[3].Text);
            if (qty <= reorder)
            {
                e.Row.Cells[2].CssClass = "redCell";
                e.Row.Cells[3].CssClass = "redCell";
            }
            e.Row.Controls.Add(tc);
            ddlAction.ID = "ddlForAction";
            ddlAction.CssClass = "ddlList";
            ddlAction.CausesValidation = false;
            ddlAction.AutoPostBack = true;
            ddlAction.Items.Add(new ListItem("View","viewProduct"));
            ddlAction.Items.Add(new ListItem("Edit", "editProduct"));
            e.Row.Cells[5].Controls.Add(ddlAction);
            ddlAction.SelectedIndexChanged += DDLAction_OnSelectedIndexChanged;

            if (ddlAction.SelectedValue == "editProduct")
            {
                editProduct();
            }
            else if (ddlAction.SelectedValue == "viewProduct")
            {
                retrieveProduct();
            }


        }
     }

您需要声明一个事件处理程序,然后将其分配给控件,然后再将控件添加到页面。

这是一个例子:

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

protected void CreateControl()
{
    var ddlAction = new DropDownList();
    ddlAction.ID = "ddlForAction";
    ddlAction.CssClass = "ddlList";
    ddlAction.CausesValidation = false;
    ddlAction.AutoPostBack = true;
    ddlAction.Items.Add(new ListItem("View","viewProduct"));
    ddlAction.Items.Add(new ListItem("Edit", "editProduct"));
    ddlAction.SelectedIndexChanged += DDLAction_OnSelectedIndexChanged;
    e.Row.Cells[5].Controls.Add(ddlAction);
}

protected void DDLAction_OnSelectedIndexChanged(object sender, EventArgs e)
{
    var action = (DropDownList) sender;

    var choice = action.SelectedValue?.Trim();
    
    string script = null;

    switch (choice)
    {
        case "viewProduct":
            script = "alert('View page!');";
            break;
        case "editProduct":
            script = "alert('Edit page!');";
            break;
        default:
            script = "alert('Unmatched Value!')";
            break;
    }
    
    ScriptManager.RegisterStartupScript(this , typeof(_Default) , "TestJS" , $"<script>{script}</script>" , false);
}

如果您想使用 JS 脚本,请使用 ScriptManager.RegisterStartupScriptResponse.Write 不会将脚本块解析为可执行块。它会抛出一个解析错误(你可以检查浏览器控制台。