使用UpdatePanel ASP.NET处理Gridview_SelectIndexChanging事件时出现问题

problem handling Gridview_SelectIndexChanging event with an UpdatePanel ASP.NET(使用UpdatePanel ASP.NET处理Gridview_SelectIndexChanging事件时出现问题)
本文介绍了使用UpdatePanel ASP.NET处理Gridview_SelectIndexChanging事件时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我会尽力解释我有什么、我正在尝试做什么以及我的问题是什么

我拥有的: 我有一个模式和更新面板(我需要它,因为回发关闭我的模式),有两个文本框,一个按钮和一个网格视图。 在文本框中,我写下一个人的名字和姓氏,然后使用按钮检索数据并将其放入网格视图。 网格视图有一个控件来选择我想要的行,在该行中,我使用前三个单元格中的数据来更改一些hidenField值,以便在另一个函数中使用。 在模式的底部,我有一个Add按钮,该按钮只更改文本框以显示我拥有正确的数据。默认情况下未启用该按钮,事件必须启用该按钮

我想要的: 我要选择所需的行,启用添加按钮,然后获取文本框中的数据。

我的问题在哪里: 当我选择我的行时,选定的索引更改将触发,但从不启用添加按钮,因此无法获取我的文本框以使用它

编码:

首码:

<div class="modal fade" id="modalSocio" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="staticBackdropLabelSocio">
                    <asp:Label ID="Label4" runat="server" CssClass="text-primary"></asp:Label>
                </h5>
               
            </div>
            
            
            <asp:UpdatePanel ID="UpdatePanel1"  runat="server" > 
          
                <ContentTemplate>
                    <div class="modal-body">
                        <div class="row g-3">
                                
                                
            <div class="row">
   <div class="col-3">
                <asp:TextBox ID="txtBusquedaNombre" runat="server" CssClass="form-control" placeholder="Nombre"></asp:TextBox>
       </div>
                <div class="col-3">
       <asp:TextBox ID="txtBusquedaApellido" runat="server" CssClass="form-control" placeholder="Apellido"></asp:TextBox>
            </div>
                <div class="col-3">
                <asp:LinkButton ID="btnBuscarSocio" runat="server"  CssClass="btn btn-outline-success" Text="Buscar" CausesValidation="false" ToolTip="Buscar" OnClick="btnBuscarSocio_Click" ><span class="fas fa-search"></span></asp:LinkButton>
             
            </div>
                  </div>
             
                            <div class="table-responsive mt-3">
            <asp:GridView ID="gvSocios" runat="server" CssClass="table table-bordered" AutoGenerateColumns="False"  CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanging="gvSocios_SelectedIndexChanging"    >
                <AlternatingRowStyle BackColor="White" />
                <Columns>
                    <asp:BoundField DataField="Legajo" HeaderText="Nro. Socio" ></asp:BoundField>
                    <asp:BoundField DataField="nombreSocio" HeaderText="Nombre" />
                    <asp:BoundField DataField="Apellido" HeaderText="Apellido" />
                    
                   
                    
                <asp:CommandField ButtonType="Link"  HeaderText="Seleccionar"  ShowSelectButton="True" SelectText="<i class='fa fa-check-circle'></i>">
                    <ControlStyle CssClass="btn btn-outline-secondary" />
                    </asp:CommandField>
           </Columns>
                <EditRowStyle BackColor="#2461BF" />
                <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#EFF3FB" />
                <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#F5F7FB" />
                <SortedAscendingHeaderStyle BackColor="#6D95E1" />
                <SortedDescendingCellStyle BackColor="#E9EBEF" />
                <SortedDescendingHeaderStyle BackColor="#4870BE" />
            <EmptyDataTemplate>
                    <div class="alert alert-primary" role="alert">
                        No se encontraron registros!
                    </div>                        
                </EmptyDataTemplate>
            </asp:GridView>
                            </div>
                                   </div>
                      </div>
                </ContentTemplate>
     
            </asp:UpdatePanel>
          
            <div class="modal-footer">
                    
                                    
                    <asp:Button ID="BtnCancelarSocio" runat="server" Text="Cancelar" CssClass="btn btn-secondary" OnClick="btnCancelar_Click" CausesValidation="False" />
                <asp:Button ID="BtnAgregarSocio" ClientIDMode="Static" runat="server"  CausesValidation="false"  Text="Seleccionar" CssClass="btn btn-success" OnClick="BtnAgregarSocio_Click"  />
                
                </div>
        </div>
    </div>
</div>

代码后面:

 protected void BtnAgregarSocio_Click(object sender, EventArgs e)
    {
        TxtSocio.Text = hfidNombreSocio.Value;
    }

    
   
    protected void gvSocios_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        var row = gvFormasPago.Rows[e.NewSelectedIndex];

        BtnAgregarSocio.Enabled = true;
            hfSocio.Value = row.Cells[0].Text;
        hfidNombreSocio.Value = row.Cells[0].Text + " - " + row.Cells[1].Text + " " + row.Cells[2].Text;

    }

我尝试不使用Enabled属性进行测试,但当Click事件激发时,该时刻的hfidNombreSocio值为空,并且模式永远不会关闭。

可能我没有正确使用更新面板。

文本框代码:

 <div class="row">
                 
                   
                    <div class="col-md-4">
                    <asp:Label ID="lblSocio" runat="server" Visible="false" Text="Socio Cuenta Corriente" CssClass="form-label"></asp:Label>
                <asp:TextBox ID="TxtSocio" runat="server" text="0"  CssClass="form-control"  ></asp:TextBox>
             
                        <asp:LinkButton ID="btnBuscar" runat="server" Visible="false"  CssClass="btn btn-outline-success" Text="Buscar" CausesValidation="false" ToolTip="Buscar" OnClick="btnBuscar_Click" ><span class="fas fa-search"></span></asp:LinkButton>   <%-- this button open the modal  --%>
                   </div>
            

推荐答案

好了,伙计们,这是其中之一,我希望有人纠正我!!

我最高兴的是脸上有一大桶鸡蛋。

我曾经说过,当您弹出一个对话框时,不能在该对话框中进行回发。我承认有很多错误!

那么,让我们构建一个网格,它允许搜索,然后我们可以点击(选择行)。

我们有:

    <div id="hoteldialog1" style="display:normal">
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>

        Enter City Name: <asp:TextBox ID="txtSearchCity" runat="server"></asp:TextBox>
        <asp:Button ID="cmdSearchCity" runat="server" Text="Search"
            style="margin-left:25px" CssClass="btn" OnClick="cmdSearchCity_Click"/>
        <br />

        <asp:GridView ID="GridHotels" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" OnSelectedIndexChanged="GridHotels_SelectedIndexChanged"
            CssClass="table">
            <Columns>
                <asp:BoundField DataField="HotelName" HeaderText="HotelName"  />
                <asp:BoundField DataField="City" HeaderText="City"  />
                <asp:BoundField DataField="Province" HeaderText="Province"  />
                <asp:BoundField DataField="Description" HeaderText="Description" />
                <asp:TemplateField HeaderText="Select">
                    <ItemTemplate>
                        <asp:Button ID="cmdHSel" runat="server" Text="Select"
                            CommandName="Select"/>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
       </ContentTemplate>
      </asp:UpdatePanel>
    </div>

因此,当我们运行时,我们得到/看到以下内容:

现在,在上面的代码中,我确实使用了CommmandName=&SELECT;,因为我想让SELECT行工作。(我非常讨厌所有这些额外的模板)。因此,我使用此代码突出显示该行。

    protected void GridHotels_SelectedIndexChanged(object sender, EventArgs e)
    {
        // user selected this row - highlight it
        int RowIX = GridHotels.SelectedIndex;
        GridViewRow gRow = (GridViewRow)GridHotels.Rows[RowIX];
        if ((ViewState["MySel"] != null) && ((int)ViewState["MySel"] != RowIX))
        {
            GridViewRow gLast = GridHotels.Rows[(int)ViewState["MySel"]];
            gLast.CssClass = "";
        }
        gRow.CssClass = "alert-info";
        ViewState["MySel"] = RowIX;
    }

好的,到目前为止很简单。上面的搜索按钮是:

protected void cmdSearchCity_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
    {
        using (SqlCommand cmdSQL = new SqlCommand("SELECT * FROM tblHotels ", conn))
        {
            if (txtSearchCity.Text != "")
            {
                // filter grid by city
                cmdSQL.CommandText += " WHERE City = @City";
                cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = txtSearchCity.Text;
            }
            conn.Open();
            cmdSQL.CommandText += " ORDER BY HotelName";
            GridHotels.DataSource = cmdSQL.ExecuteReader();
            GridHotels.DataBind();
        }

    }
}

再说一遍,非常简单。

好了,现在钱打出来了。现在是罗塞塔石碑。现在是牛肉,现在是魔术,现在是神奇!

上面提到的内容放在";div";中,并且有一个更新面板。

那么,现在让我们放入另一个网格!

我们将显示一些人,并弹出上面的酒店选择器网格!!

因此,我们现在拥有以下内容:

        <asp:GridView ID="GPeople" runat="server" AutoGenerateColumns="False"
            DataKeyNames="ID" >
            <Columns>
                <asp:BoundField DataField="Firstname" HeaderText="Firstname"    />
                <asp:BoundField DataField="LastName" HeaderText="LastName"      />
                <asp:BoundField DataField="City" HeaderText="City"              />
                <asp:BoundField DataField="Province" HeaderText="Province"      />

                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="cmdGetHotel" runat="server" Text="Hotels"
                            OnClick="cmdGetHotel_Click"
                            OnClientClick="return mypop(this);"
                            />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

和代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadPeople();
    }
        
    void LoadPeople()
    {
        GPeople.DataSource = MyRst("SELECT * from People Order by FirstName");
        GPeople.DataBind();
    }

所以我们现在有了一个人的网格。现在,我们想要单击一行,弹出酒店列表。

因此,我建议使用jQuery.UI,因为这要好得多(而且比引导对话框更干净)。

我们在上面点击此行:

          <asp:Button ID="cmdGetHotel" runat="server" Text="Hotels"
              OnClick="cmdGetHotel_Click"
              OnClientClick="return mypop(this);"
          />

所以在上面,我们有一个服务器端按钮,然后是一个弹出对话框的客户端js函数(仅当我们点击OK时才返回TRUE。

所以,现在我们所需要的就是弹出对话框的js代码。代码是这样的:

   <script>
       selok = false;
       function mypop(btn) {

           if (selok)
               return true;


           var mydiv = $("#hoteldialog1")
           mydiv.dialog({
               modal: true, appendTo: "form",
               title: "Test dialog", closeText: "",
               width: "40%",
               position: { my: 'left top', at: 'right bottom', of: btn },

               buttons: {
                   Ok: (function () {
                       selok = true;
                       btn.click()
                   }),
                    Cancel: (function () {
                        mydiv.dialog("close")
                    })
                }
               
           });

           return false;
       }
   </script>

(设置酒店网格显示:无-jquery.ui将管理此内容)。

所以,现在我们得到的是:

因此我们可以自由搜索、回发,当然还可以选择行。

如果用户点击OK,则运行第一个网格按钮代码。我没有对第一个网格使用选定的索引更改事件(我本可以使用),但我使用了以下代码:

   protected void cmdGetHotel_Click(object sender, EventArgs e)
    {
        Debug.Print("hotel grid click");
        Button btn = (Button)sender;
        GridViewRow gRow = (GridViewRow)btn.Parent.Parent;
        Debug.Print("Grid row = " + gRow.RowIndex);
        Debug.Print("PK = " + GPeople.DataKeys[gRow.RowIndex]["ID"].ToString());
还请注意,当POP网格隐藏时?我们仍然可以从该行获取任何数据,因为该网格的选定索引确实存在!!

例如:

        GridViewRow gRow = (GridViewRow)GHotels.Rows[GHotels.SelectedIndex];
        Debug.Print("Grid row = " + gRow.RowIndex);
        Debug.Print("PK = " + GPeople.DataKeys[gRow.RowIndex]["ID"].ToString());
        // cells collection, or find control to grab any other value

因此,我认为您应该转储引导对话框。

把你的第二个漂亮的网格+搜索,回发-任何你想要的东西放到一个有名字的div中,然后使用jQuery.UI弹出网格。这将允许搜索、回发,然后当用户选择该行并单击确定时,您现在可以自由关闭此对话框,并且您有该弹出窗口集的索引(&q;index&q;)。

这篇关于使用UpdatePanel ASP.NET处理Gridview_SelectIndexChanging事件时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)