Ali Ahmed
Ali Ahmed

Reputation: 489

How to use ModalPopUpExtender in GridView?

I have following tables in my database:

SuggestionsLog Table: ID, Title, Description.

Employee Table: Username, Name

Divisions Table: DivisionCode, DivisionName

I want to show table that consists of SuggestionID, SuggestionTitle, EmployeeName and DivisionName only and when the user clicks on the SuggestionTitle, a pop-up window will be displayed with the description of the suggestion.

Since I am ASP.NET beginner developer, I tried to follow this tutorial to get it but I failed.

What I did is the following:

ASP.NET Code:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ID" 
            DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                    ReadOnly="True" SortExpression="ID" />
                <asp:TemplateField HeaderText="Title">
                    <ItemTemplate>
                        <asp:LinkButton runat="server" ID="lnkSuggestionTitle"
                                        Text='<%#Eval("Title") %>' 
                                        OnClick="lnkSuggestionTitle_Click">
                                        </asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <%--<asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />--%>
                <asp:BoundField DataField="Description" HeaderText="Description" 
                    SortExpression="Description" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Username" HeaderText="Username" 
                    SortExpression="Username" />
                <asp:BoundField DataField="DivisionName" HeaderText="Division" 
                    SortExpression="DivisionName" />
            </Columns>
        </asp:GridView>

        <asp:Button runat="server" ID="btnModalPopUp" style="display:none" />

        <AjaxToolkit:ModalPopupExtender ID="modalPopUpExtender1" 
                                        runat="server" TargetControlID="btnModalPopUp" PopupControlID="pnlPopUp" BackgroundCssClass="modalBackground" 
                                        OkControlID="btnOk" X="20" Y="100">
        </AjaxToolkit:ModalPopupExtender>

        <asp:Panel runat="server" ID="pnlPopUp" CssClass="confirm-dialog">
            <asp:GridView ID="GridView2" runat="server">
            </asp:GridView>
        </asp:Panel>

        </ContentTemplate>
        </asp:UpdatePanel>
        <br /> 

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
            SelectCommand="SELECT     dbo.SafetySuggestionsLog.ID, dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.employee.Name, dbo.SafetySuggestionsLog.Username, 
                      dbo.Divisions.DivisionName
FROM         dbo.employee INNER JOIN
                      dbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN
                      dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode">
        </asp:SqlDataSource>

Code-Behind:

protected void lnkSuggestionTitle_Click(object sender, EventArgs e)
    {
        LinkButton lnkSuggestionTitle = sender as LinkButton;
        string strSuggestionTitle = lnkSuggestionTitle.Text;

        string strConnectionString = ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString;
        string strSelect = "SELECT ID, Title, Description FROM  dbo.SafetySuggestionsLog";
        SqlConnection sqlCon = new SqlConnection();
        sqlCon.ConnectionString = strConnectionString;
        SqlCommand cmdSuggestionDetails = new SqlCommand();
        cmdSuggestionDetails.Connection = sqlCon;
        cmdSuggestionDetails.CommandType = System.Data.CommandType.Text;
        cmdSuggestionDetails.CommandText = strSelect;
        cmdSuggestionDetails.Parameters.AddWithValue("@Title", strSuggestionTitle);
        sqlCon.Open();

        SqlDataReader dReader = cmdSuggestionDetails.ExecuteReader();
        GridView1.DataSource = dReader;
        GridView1.DataBind();
        sqlCon.Close();
        modalPopUpExtender1.Show();
    }

Everything is going well and smooth, but in the website, when I clicked on one of the titles, I did not get the ModalPopUp. Also, I got an error notification at the left bottom corner in the Internet Explorer browser, which when I opened it, it gave me the following description:

**

Sys.ArgumentNullException: Value cannot be null. Parameter name: elements

**

I don't know why this is happened. Any help please?

Upvotes: 1

Views: 5122

Answers (2)

Fandango68
Fandango68

Reputation: 4858

Following on from @PeterX's suggestion, yes your Panel declaration is missing a lot of things.

I would redo this like something as this, which is what I use inside another even bigger GridView control.

                            <ajaxToolkit:ModalPopupExtender ID="mpeEndorsed" runat="server"
                                BackgroundCssClass="modalBackground"
                                PopupControlID="pnlEndorsed"
                                OkControlID="btnEndorsed"
                                CancelControlID="btnNotEndorsed"
                                PopupDragHandleControlID="dvHdr"
                                Drag="true"
                                TargetControlID="cbEndorsed">
                            </ajaxToolkit:ModalPopupExtender>
                            <asp:Panel ID="pnlEndorsed" runat="server" CssClass="pnlEndorsed" style="display:none">
                                <div id="dvHdr">
                                    <asp:Label ID="Label3" runat="server">** CONTACT LOG **</asp:Label>
                                </div>
                                <div id="dvBody">
                                    <table style="text-align:center; width:100%">
                                        <tr>
                                            <asp:GridView ID="gvContactLog" runat="server" ForeColor="#333333" GridLines="None" AllowPaging="true" PageSize="8" Font-Size="X-Small" CellPadding="4" AllowSorting="True" AutoGenerateColumns="False">
                                            </asp:GridView>
                                        </tr>
                                        <tr>
                                            <td>
                                                <asp:Button ID="btnEndorsed" runat="server" Text="YES" />
                                                <asp:Button ID="btnNotEndorsed" runat="server" Text="NO" />
                                            </td>
                                        </tr>
                                    </table>
                                </div>
                            </asp:Panel>

Note the GridView inside the pop-up Panel is a skeleton, that has to be built up either from JavaScript or CodeBehind to get it to be useful.

Defining a Gridview in its entirety (with DataSource, fields, etc) inside a pop-up panel, that's inside another even bigger Gridview (as in my case), does not work! You will get a muddled looking screen and things all over the place. I guess it's a limitation of the AjaxToolKit, to mix client-side and server-side functionality.

Upvotes: 0

PeterX
PeterX

Reputation: 2901

This issue is usually a bad OkControlID or CancelControlID (via here), which could be "btnOk" in this case.

Upvotes: 3

Related Questions