Nano Hash - криптовалюты, майнинг, программирование

ASP.NET Как показать модальное всплывающее окно AjaxControlToolkit из CheckBox

Мне нужно показать элемент управления AjaxControlToolkit ModalPopupExtender, когда пользователь проверяет / снимает отметку с элемента управления CheckBox, который находится внутри GridView как TemplateField.

- Обновлено 24 мая 2013 г.

Смотрите окончательное решение здесь ...

Мы наконец решили проблему. Поэтому я решил опубликовать здесь полное решение и окончательный код.

GridView

<asp:GridView ID="gvDocs" runat="server" CssClass="grid" AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true"
OnPageIndexChanging="gvDocs_PageIndexChanging"
OnSorting="gvDocs_Sorting"
OnRowDataBound="gvDocs_RowDataBound">
<AlternatingRowStyle CssClass="grid_row_alternate"/>
<HeaderStyle CssClass="grid_header" />
<RowStyle CssClass="grid_row" />
<SelectedRowStyle CssClass="grid_row_selected" />
<Columns>
    <asp:BoundField DataField="ID"/>
    <asp:BoundField DataField="COLUMN_A" SortExpression="COLUMN_A" HeaderText="COLUMN_A" />
    <asp:BoundField DataField="COLUMN_B" SortExpression="COLUMN_B" HeaderText="COLUMN_B" />

    <!-- TemplateField with the CheckBox and the ModalPopupExtender controls -->

    <asp:TemplateField HeaderText="Check" SortExpression="CHECK_COLUMN">
        <ItemStyle HorizontalAlign="Center"/>
        <ItemTemplate>
            <asp:CheckBox ID="CheckBox1" runat="server"/>

            <!-- Modal Popup block -->

            <asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" BackgroundCssClass="modalBackground" DropShadow="True" TargetControlID="CheckBox1" PopupControlID="panModalPopup" CancelControlID="CancelButton"/>
            <asp:Panel ID="panModalPopup" runat="server" style="display:none; text-align:left; width:400px; background-color:White; border-width:2px; border-color:#40A040; border-style:solid; padding:10px;">
                Are you sure?
                <br /><br />
                <div style="text-align:right;">
                    <asp:Button ID="ConfirmButton" runat="server" Text="Confirm" OnClick="ConfirmButton_Click" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID") %>'/>
                    <asp:Button ID="CancelButton" runat="server" Text="Cancel"/>
                </div>
            </asp:Panel>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

The code behind

protected void gvDocs_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType.Equals(DataControlRowType.DataRow))
    {
        // Setting the CheckBox check reading the state from DB
        CheckBox CheckBox1 = (CheckBox)e.Row.FindControl("CheckBox1");
        CheckBox1.Checked = DataBinder.Eval(e.Row.DataItem, "CHECK_COLUMN").ToString() == "Y"; // Or any other value that works like true/false
    }
}

protected void ConfirmButton_Click(object sender, EventArgs e)
{
    string id = ((Button)sender).CommandArgument; // Get the ID column value

    // Update the CHECK_COLUMN value on the DB or do whatever you want with the ID...

    BindData(); // Method that do the GridView DataBind after the changes applied to the DB
}

Что нужно знать

1) Элемент управления ModalPopupExtender1 находится внутри поля GridView TemplateField, поскольку ему необходим доступ к CheckBox1 и его событию щелчка. Вероятно, это не лучшее решение, но оно работает и поэтому не сильно повлияет на производительность, если ваш GridView не слишком сложен и если он выгружен.

2) Чтобы поймать событие ConfirmButton Click, необходимо удалить свойство OKControlID из настроек элемента управления ModalPopupExtender.

-- КОНЕЦ

- Обновлено 22 мая 2013 г.

Затем мне нужен идентификатор соответствующей строки, чтобы выполнить ОБНОВЛЕНИЕ БД.

-- КОНЕЦ

Это GridView

<asp:GridView ID="gvDocs" runat="server" CssClass="grid" AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true"
OnPageIndexChanging="gvDocs_PageIndexChanging"
OnSorting="gvDocs_Sorting"
OnRowDataBound="gvDocs_RowDataBound">
<AlternatingRowStyle CssClass="grid_row_alternate"/>
<HeaderStyle CssClass="grid_header" />
<RowStyle CssClass="grid_row" />
<SelectedRowStyle CssClass="grid_row_selected" />
<Columns>
    <asp:BoundField DataField="ID_DOCUMENTO" Visible="False"/>
    <asp:BoundField DataField="NUM_PROT" SortExpression="NUM_PROT" HeaderText="N. Prot." />
    <asp:BoundField DataField="DATE_PROT" SortExpression="DATE_PROT" HeaderText="Data Prot." />

    ... some other BoundFields ...

    <asp:TemplateField HeaderText="Da archiviare" SortExpression="DA_ARCHIVIARE">
        <ItemStyle HorizontalAlign="Center"/>
        <ItemTemplate>
            <asp:CheckBox ID="chkArchiviare" runat="server" AutoPostBack="True" OnCheckedChanged="chkArchiviare_CheckedChanged"/>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

And this is the ModalPopup block

<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</asp:ToolkitScriptManager>

<asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" DropShadow="True" TargetControlID="panModalPopup" PopupControlID="panModalPopup" OkControlID="btnConferma" CancelControlID="btnAnnulla" />

<asp:Panel ID="panModalPopup" runat="server" style="display:none; width:400px; background-color:White; border-width:2px; border-color:Black; border-style:solid; padding:20px;">
    Are you sure?
    <br /><br />
    <div style="text-align:right;">
        <asp:Button ID="btnConferma" runat="server" Text="Conferma" OnClick="btnConferma_Click"/>
        <asp:Button ID="btnAnnulla" runat="server" Text="Annulla" OnClick="btnAnnulla_Click" />
    </div>
</asp:Panel>

Теперь я хочу отображать ModalPopup каждый раз, когда флажок установлен / снят, и это всплывающее окно должно отображать подтверждающее сообщение с двумя кнопками: Подтвердить и Отменить. Подтвердите, что необходимо выполнить обновление в БД, а затем выполнить обратную передачу. Отменить осталось только скрыть всплывающее окно без обратной передачи.

Я знаю, что ModalPopupExtender слушает события OnClick. Итак, нужна ли мне кнопка, LinkButton, ImageButton и т. Д. Или я могу делать то, что хочу?


Ответы:


1

Вы правы, он прослушивает события onclick, но только на стороне клиента, поэтому целевым элементом управления расширителя может быть все, на что вы можете щелкнуть, даже div или метку.

21.05.2013
  • О, классно! Я попробую! Спасибо! 21.05.2013
  • Я помещаю TargetControlID="chkArchiviare", это имя моего элемента управления CheckBox в GridView, но я получаю сообщение об ошибке времени выполнения от AjaxControlToolkit, в котором говорится: TargetControlID ModalPopupExtender1 недействителен. Не удалось найти элемент управления с ID = chkArchiviare. Любые идеи? 22.05.2013
  • вам нужно поместить модальное всплывающее окно и панель в шаблон элемента gridview, я уверен 22.05.2013
  • Да, похоже, это так. Но у меня два вопроса: 1) Правильно ли ставить ModalPopup и Panel с кнопками на TemplateField? Разве они не инициализировались бы один раз для каждой строки? 2) На моей странице у меня есть главный GridView с CheckBox, который должен отображать ModalPopup, а также подробный GridView под первым, который появляется, когда пользователь щелкает ROWID. Эта деталь GridView имеет тот же столбец CheckBox, который должен иметь такое же поведение, что и другой. Нужно ли мне ставить еще один блок ModalPopup с собственной панелью и кнопками? 22.05.2013
  • Кроме того, какое событие я могу поймать, нажав кнопку ОК в модальном всплывающем окне? Я пробовал с OnClick="btnConferma_Click", это событие OnClick кнопки OK, но это не так. 22.05.2013
  • Да, вы правы, но я думаю, что вы не можете соединить модальные элементы управления вне gridview с элементами управления внутри gridview. 22.05.2013
  • Вам нужно поймать событие RowCommand в gridview. stackoverflow.com/ questions / 10970501 / 22.05.2013
  • Сделай это! :-) Вы должны удалить OKControlID в определении ModalPopupExtender, чтобы кнопка OK могла запускать событие OnClick как обычно, и вы могли поймать его с помощью `Button_OnClick ', а затем выполнить PostBack. Спасибо! 22.05.2013
  • Я кое-что забыл ... Мне нужно получить идентификатор строки, в которой CheckBox был отмечен / снят, чтобы обновить соответствующее поле в БД. Как мне его получить? 22.05.2013
  • позвольте нам продолжить обсуждение в чате 22.05.2013

  • 2

    попробуйте показать / скрыть ModalPopupExtender1 из такого события chkArchiviare_CheckedChanged.

    ModalPopupExtender1.show();
    

    и

    ModalPopupExtender1.hide();
    

    возьмите одну скрытую кнопку и сделайте ее TargetControlID вот так.

    <asp:HiddenField ID="btnHiddenDtl1" runat="Server" />
    <asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" DropShadow="True" TargetControlID="btnHiddenDtl1" PopupControlID="panModalPopup" OkControlID="btnConferma" CancelControlID="btnAnnulla" />
    

    вам не нужно вызывать событие нажатия кнопки отмены, чтобы скрыть ModalPopupExtender1.

    21.05.2013
  • Я сделал это, но всякий раз, когда всплывающее окно показывает, оно зависает, поэтому даже если я нажму кнопку «Отмена», оно не скроется. Я сделал Cancel_Click(object sender, EventArgs e) событие, в котором вызываю ModalPopupExtender1.hide();. 21.05.2013
  • поместите свойство CancelControlID = Cancel в свой тег ModalPopupExtender1. он автоматически закроет ваш ModalPopupExtender1. 22.05.2013
  • Как вы можете видеть выше в блоке кода, там CancelControlID="btnAnnulla" - это имя элемента управления «кнопка», но он не работает. 22.05.2013
  • пожалуйста, смотрите мой отредактированный ответ. 22.05.2013
  • Может, проблему нашел ... Ставил TargetControlID="panModalPopup" и тоже PopupControlID="panModalPopup". Таким образом, целевым элементом управления, который должен активировать модальное всплывающее окно, было само всплывающее окно ... В любом случае, если я помещу TargetControlID="chkArchiviare", это имя моего элемента управления CheckBox внутри GridView, я получаю сообщение об ошибке времени выполнения от AjaxControlToolkit, в котором говорится: TargetControlID ModalPopupExtender1 не действительный. Не удалось найти элемент управления с ID = chkArchiviare. Возможно, это связано с тем, что GridView будет сгенерирован после события инициализации ModalPopup? 22.05.2013
  • вам нужно указать TargetControlID = hiddenbuttonID, а не TargetControlID = chkArchiviare, вы не найдете элемент управления chkArchiviare для gridview в ModelPopUp. поэтому я сказал вам взять дополнительную скрытую кнопку для TargetControlID и установить ее как TargetControlID = hiddenbuttonID. Не указывайте TargetControlID = chkArchiviare. 22.05.2013
  • Я использовал решение, опубликованное @AGuyCalledGerald, которое мне подходит. Спасибо, в любом случае! 22.05.2013

  • 3

    Вам не нужно включать ModalPopup Extender в свой GridView. Вы можете привязать элемент управления флажком в поле шаблона в GridView и использовать в нем свойство OnCheckedChanged ... Таким образом, шаблон будет таким, как показано ниже

     <asp:TemplateField HeaderText="Da archiviare" SortExpression="DA_ARCHIVIARE">
        <ItemStyle HorizontalAlign="Center"/>
        <ItemTemplate>
            <asp:CheckBox ID="chkArchiviare" runat="server" 
                 OnCheckedChanged="chkArchiviare_CheckedChanged"/>
        </ItemTemplate>
    </asp:TemplateField>
    

    После этого вы должны вызвать функцию show для события chkArchiviare_CheckedChanged ... вот так

      ModalPopupExtender1.Show();
    

    Здесь ModalPopupExtender1 - это идентификатор вашего элемента управления ModalPopupExtender.

    Еще одна вещь, которую вы должны запомнить: используйте одну кнопку на странице .aspx. И передайте этот идентификатор кнопки в ModalPopupExtender TargetControlID ... Вот так

     <asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" DropShadow="True"  
          TargetControlID="btnShowModalPopup" PopupControlID="panModalPopup" 
          OkControlID="btnConferma" CancelControlID="btnAnnulla" />
    
     <asp:Panel ID="panModalPopup" runat="server" style="display:none; width:400px; 
          background-color:White; border-width:2px; border-color:Black; border-
          style:solid; padding:20px;"> Are you sure?<br /><br />
       <div style="text-align:right;">
        <asp:Button ID="btnConferma" runat="server" Text="Conferma" 
             OnClick="btnConferma_Click"/>
        <asp:Button ID="btnAnnulla" runat="server" Text="Annulla" 
             OnClick="btnAnnulla_Click" />
       </div>
     </asp:Panel>
    

    Здесь, почему я использую эту кнопку? .... Эта кнопка не используется, потому что мы используем show () в коде позади ... но если мы не передаем идентификатор кнопки в свойство ModapPopupExtender TargetControlId. Это выдаст вам ошибку.

    Таким образом, используя ModalPopupExtender ... вы можете использовать его с LinkButton, Label, Button. Для получения более подробной информации с примером вы можете проверить ссылку ниже ....

    Как использовать ModalPopup Extender в GridView

    Надеюсь, эта статья развеет все ваши сомнения .... Наслаждайтесь и поделитесь этим с другими ... Спасибо!

    27.06.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..