【问题标题】:Dropdownlist inside Updatepanel not passing selected itemUpdatepanel 中的下拉列表未传递所选项目
【发布时间】:2018-02-02 14:38:44
【问题描述】:

我有一个带有隐藏/显示面板的 Gridview。面板内有一个下拉菜单和一个按钮。在按下按钮时,我需要下拉列表的选定值,但我不断得到第一个项目,无论选择什么。

我一直在调查这个问题,它与面板控制有关。如果我将下拉菜单放在面板外,一切都会按预期工作。但下拉仅在面板内传递第一个值。

这是我的代码:

ASP 代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DD.aspx.cs" Inherits="DD" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" />
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <title></title>
       <script type="text/javascript">

        $(document).on("click", '[src*=plus]', function () {
            $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>")
            $(this).attr("src", "images/minus.png");
        });

        $(document).on("click", '[src*=minus]', function () {
            $(this).attr("src", "images/plus.png");
            $(this).closest("tr").next().remove();

        })
    </script>
</head>
<body>
    <form id="form1" runat="server">
       <asp:ScriptManager runat="server"></asp:ScriptManager>
                                     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:constr %>" SelectCommand="SELECT * FROM [Requests]"></asp:SqlDataSource>
         <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:constr %>" SelectCommand="SELECT [Name] FROM [Staff]"></asp:SqlDataSource>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="RequestID" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="RequestID" HeaderText="RequestID" InsertVisible="False" ReadOnly="True" SortExpression="RequestID" />
                <asp:TemplateField>
                   <ItemTemplate>
                        <img runat="server" style="cursor: pointer" src="images/plus.png" />
                        <asp:UpdatePanel ID="pnlOrders" runat="server" Style="display: none"  UpdateMode="Conditional">

                            <ContentTemplate>                
        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" DataTextField="Name" DataValueField="Name" AutoPostBack="true">
        </asp:DropDownList>
       <asp:Button runat="server" ID="test" OnClick="test_Click" />
                         </ContentTemplate>     </asp:UpdatePanel>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

C#代码

protected void test_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    GridViewRow gvr = (GridViewRow)btn.NamingContainer;
    DropDownList referalDD = gvr.FindControl("DD1") as DropDownList;
    string www = referalDD.SelectedItem.Text;
    string qqq = referalDD.SelectedItem.Value;
}

谁能帮我解决这个问题

【问题讨论】:

  • 您是否正在检查Page_Load 事件中的IsPostBack 条件?
  • 我的猜测是,您可以从IsPostBack check 中的代码绑定您的数据源。这可能会解决
  • IsPostBack 每次按下按钮都会被击中。这会导致 DD1 的重置吗?如果是,我该如何处理?
  • IsPostBack 如果事件是从 UpdatePannel 触发的,则不允许检查,但我不确定从 aspx 页面设置 DataSource,我的意思是它将如何加载。
  • 我什至尝试从 gridview 的 rowdatabind 事件填充 DD。它填充得很好,但仍然只返回下拉菜单中的第一项。

标签: c# asp.net gridview webforms


【解决方案1】:

好的,所以我找到了解决方法/解决方案。感谢 Niko 的占位符建议。 我摆脱了这段代码:

<img runat="server" style="cursor: pointer" src="images/plus.png" />

和相关的Jquery

$(document).on("click", '[src*=plus]', function () {
    $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>")
    $(this).attr("src", "images/minus.png");
});

$(document).on("click", '[src*=minus]', function () {
    $(this).attr("src", "images/plus.png");
    $(this).closest("tr").next().remove();

})

在更新面板和图像按钮周围添加了一个占位符

<asp:ImageButton runat="server" ID="ShowHide" ImageUrl="~/images/plus.png" OnClick="ShowHide_Click"  />
<asp:PlaceHolder ID="PlaceHolder1" runat="server" Visible="false">

以及此按钮单击事件的代码。

protected void ShowHide_Click(object sender, EventArgs e)
{
    ImageButton btn = (ImageButton)sender;
    GridViewRow gvr = (GridViewRow)btn.NamingContainer;
    PlaceHolder ph = gvr.FindControl("PlaceHolder1") as PlaceHolder;
    if (btn.ImageUrl.ToString() == "~/images/plus.png")
    {
        ph.Visible = true;
        btn.ImageUrl = "~/images/minus.png";
    }
    else
    {
        ph.Visible = false;
        btn.ImageUrl = "~/images/plus.png";
    }

}

注意: 在进一步测试后,整个问题与 UpdatePanel 有此代码有关 Style="display: none" 我删除此代码后,一切正常。但是我为显示/隐藏功能添加了占位符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2018-03-12
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多