проблема обработки события Gridview_SelectIndexChanging с помощью панели обновления ASP.NET

#c# #asp.net #.net #gridview #updatepanel

Вопрос:

я постараюсь объяснить, что у меня есть, что я пытаюсь сделать и в чем моя проблема

что у меня есть: у меня есть модальная панель с и обновлением (она мне нужна, потому что обратная связь закрывает мою модальную), в которой есть два текстовых поля, кнопка и вид сетки. в текстовом поле я пишу имя и фамилию человека и с помощью кнопки извлекаю данные и помещаю их в сетку. в представлении сетки есть элемент управления для выбора нужной строки, с помощью этой строки я использую данные из первых трех ячеек, чтобы изменить некоторые значения скрытых полей для использования в другой функции. в нижней части модального у меня есть кнопка добавить, которая изменяет только текстовое поле, чтобы показать, что у меня есть правильные данные. эта кнопка по умолчанию не включена, и событие должно ее включить

что я хочу: я хочу выбрать нужную строку, включить кнопку «Добавить» и получить данные в своем текстовом поле.

в чем моя проблема: когда я выбираю свою строку, selectedindexchanging срабатывает, но никогда не включает кнопку «Добавить», поэтому я не могу получить свое текстовое поле для его использования

код:

передний код:

 <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>
            
 

Комментарии:

1. Ну, независимо от кода, я НИКОГДА не знал, что введение панели обновления позволяет выполнять обратную отправку без отключения всплывающего окна. Как правило, всплывающее окно не может пережить обратную отправку-даже при использовании панели обновления. Сделайте быстрый тест и бросьте в испытательный самолет Джейн asp.net кнопка — посмотрите, что произойдет, когда вы нажмете на нее, — вполне уверен, что всплывающее окно изменится.

2. Добавьте HiddenField , что вы можете сохранить значение состояния всплывающего окна (показать / скрыть), так как это значение будет сохраняться между обратными передачами, а затем при перезагрузке обратной передачи проверьте значение, чтобы определить, нужно ли его показывать.

3. @AlbertD.Kallal я не знаю, что такое испытательный самолет Джейн asp.net кнопка, не могли бы вы привести мне пример?

4. @JohnPete22 я не знаю, как я могу это сделать, потому что модальные всплывающие окна с событием от кнопки btnBuscar код такой: ` ScriptManager. RegisterStartupScript(это, это. GetType(), «Pop», «$(‘#modalSocio’).модальный(‘показать’);», true); `

5. в вашем всплывающем окне введите стандартный asp.net кнопка, есть код для отладки.выведите «Привет». Теперь нажмите эту кнопку — это вызовет обратный отсчет, и ваш модальный диалог свернется. Для проверки этого требуется 15 секунд. Как я уже говорил, я НЕ знаю, что модальный диалог может пережить обратную передачу. В таком случае попытка использовать обновленную панель вам не поможет. теперь, если я ошибаюсь, то мои комментарии могут быть проигнорированы и не имеют под собой оснований.

Ответ №1:

Ладно, ребята, это один из тех случаев, когда я хотел бы, чтобы кто-нибудь меня поправил!!

Я ОЧЕНЬ РАД, что у меня на лице большие ведра яиц.

Я в течение некоторого времени проповедовал, что, когда вы открываете диалоговое окно, в этом диалоговом окне не может быть обратной записи. Я стою СИЛЬНО исправленным!!!!

Итак, давайте построим сетку, она позволяет выполнять поиск, а затем мы можем нажать (выбрать строку).

У нас есть это:

     <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 = «выбрать», потому что я хотел, чтобы строка выбора работала. (и я просто ненавижу все эти дополнительные шаблоны). Поэтому я использовал этот код, чтобы выделить строку.

     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) amp;amp; ((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.Пользовательский интерфейс, как намного лучше (и чище, чем диалоговое окно начальной загрузки).

Итак, у нас есть эта строка, нажмите выше:

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

Итак, в приведенном выше примере у нас есть кнопка на стороне сервера, а затем функция js на стороне клиента, которая открывает диалоговое окно (и возвращает значение true ТОЛЬКО в том случае, если мы нажмем ok.

Итак, теперь все, что нам нужно, — это код 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 будет управлять этим).

Итак, теперь мы получаем это:

введите описание изображения здесь

Таким образом, мы можем свободно искать, иметь обратные ссылки и, конечно же, выбирать строку.

Если пользователь нажимает «ОК», запускается первый код кнопки сетки. Я НЕ использовал выбранное событие изменения индекса для этой первой сетки (я мог бы), но я использовал этот код:

    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());
 

Также обратите внимание, что в то время как всплывающая сетка скрыта? Мы ВСЕ еще можем получить любые данные из этой строки, так как выбранный индекс этой сетки сохраняется!!

напр.:

         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
 

Итак, я думаю, вам следует сбросить диалоговое окно начальной загрузки.

Поместите свою 2-ю красивую сетку поиск, разместите обратные ссылки — все, что вы хотите, в div с именем и используйте jQuery.Пользовательский интерфейс для отображения сетки. Это позволит выполнять поиск, отправлять обратные сообщения, а затем, когда пользователь выберет строку и нажмет «ОК», вы можете закрыть это диалоговое окно, и у вас есть «индекс» этого всплывающего окна, установленный для вас.

Комментарии:

1. ты лучший, ты спас меня, спасибо

2. Пожалуйста. В прошлом тестировал и пытался использовать jquery. Диалоговое окно пользовательского интерфейса, но оно НЕ выдержало бы отката. Совершенно уверен, что поместите панель обновления вокруг div (это не работает). Но, div, а ЗАТЕМ панель обновления внутри работает!!! (сюрприз для меня!!!0. Это открывает ОГРОМНЫЕ двери для создания своего рода всплывающих диалогов с обратными ссылками. Действительно большое дело, и поэтому мы можем использовать серверный код для наших диалогов. Обратите внимание, что кнопка нажмите трюк с возвращением true/false. Диалоговое окно асинхронно, но этот флаг «ок» позволяет это сделать.