Мне нужно показать элемент управления 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 и т. Д. Или я могу делать то, что хочу?
TargetControlID="chkArchiviare"
, это имя моего элемента управления CheckBox в GridView, но я получаю сообщение об ошибке времени выполнения от AjaxControlToolkit, в котором говорится: TargetControlID ModalPopupExtender1 недействителен. Не удалось найти элемент управления с ID = chkArchiviare. Любые идеи? 22.05.2013OnClick="btnConferma_Click"
, это событие OnClick кнопки OK, но это не так. 22.05.2013OKControlID
в определении ModalPopupExtender, чтобы кнопка OK могла запускать событие OnClick как обычно, и вы могли поймать его с помощью `Button_OnClick ', а затем выполнить PostBack. Спасибо! 22.05.2013