2

我需要显示一个 AjaxControlToolkit ModalPopupExtender 控件,当用户选中/取消选中作为 TemplateField 的 GridView 内的 CheckBox 控件时。

--更新于 24/05/2013

在此处查看最终解决方案...

我们终于解决了这个问题。所以我决定在这里发布完整的解决方案和最终代码。

网格视图

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

背后的代码

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) 为了捕捉ConfirmButtonClick 事件,您必须从控件设置中删除该OKControlID属性。ModalPopupExtender

- 结尾

--更新于 22/05/2013

然后我需要相应行的 ID在数据库上进行更新。

- 结尾

这是网格视图

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

这是 ModalPopup 块

<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,并且该弹出窗口必须显示带有 2 个按钮的确认消息:确认和取消。确认必须对数据库进行更新,然后回发。取消只需隐藏弹出窗口而不回发。

我知道 ModalPopupExtender 监听 OnClick 事件。那么,我是否需要一个 Button、LinkBut​​ton、ImageButton 等,或者我可以做我想做的事吗?

4

3 回答 3

4

你是对的,它监听 onclick 事件,但是客户端事件,所以,扩展器的目标控件可以是任何你可以点击的东西,甚至是一个 div 或一个标签。

于 2013-05-21T15:42:47.023 回答
0

尝试像这样从 chkArchiviare_CheckedChanged 事件中显示/隐藏 ModalPopupExtender1。

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

于 2013-05-21T17:19:47.900 回答
0

您无需在 GridView 中包含 ModalPopup Extender。您可以在 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>

在此之后,您必须在chkArchiviare_CheckedChanged事件上调用 show 函数......就像这样

  ModalPopupExtender1.Show();

这里 ModalPopupExtender1 是您的 ModalPopupExtender 控件的 ID。

您必须记住的另一件事是使用 .aspx 页面上的一个按钮。并将此按钮 ID 传递给 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>

Here Why Iam using this button?....没有使用此按钮,因为我们在代码隐藏中使用 show()...但是如果我们没有将按钮 Id 传递给ModapPopupExtender TargetControlId 属性。它会给你一个错误。

所以以这种方式使用 ModalPopupExtender...您可以将它与 LinkBut​​ton、Label、Button 一起使用。有关示例的更多详细信息,您可以查看以下链接....

如何在 GridView 中使用 ModalPopup Extender

我希望这篇文章能消除您的所有疑虑....享受并与他人分享...谢谢!

于 2013-06-27T08:39:33.290 回答