ModalPopupExtender внутри шаблона элемента GridView - PullRequest
1 голос
/ 16 июля 2010

Как мне использовать GridView TemplateField, содержащий LinkButton, который должен отображать модальные при нажатии? У меня есть строки данных, которые я хочу обновить, нажимая кнопку «Редактировать» в этой строке. Есть куча данных, которые мне нужно загрузить с помощью кода, незадолго до того, как модал отобразит.

Я пробовал следующее, но я не могу сделать Modal1.Show() в обработчике событий, потому что он находится в TemplateField:

<ItemTemplate>
  <asp:Button runat="server" ID="HiddenForModal" style="display: none" />
    <ajaxToolkit:ModalPopupExtender ID="Modal1" runat="server" TargetControlID="HiddenForModal" PopupControlID="pnlModal" />
    <asp:LinkButton ID="btnEdit" runat="server" Text="Edit" onclick="btnEdit_Click" />
    <asp:LinkButton ID="btnDelete" runat="server" Text="Delete"></asp:LinkButton>
</ItemTemplate>

Спасибо, Mark

1 Ответ

3 голосов
/ 18 мая 2011

Ключ знает, какой строкой в ​​GridView была кнопка LinkButton, по которой щелкнули. Вы можете сделать это несколькими способами, но способ, которым я реализовал это, состоит в том, чтобы захватить это в событии RowCommand. Затем вы можете получить доступ к ModalPopupExtender в строке щелчка через FindControl (..).

Страница:

<asp:TemplateField>
  <ItemTemplate>
    <asp:Button ID="Button1" runat="server" style="Display:none;" Text="Button" />
    <cc1:ModalPopupExtender ID="ModalPopupExtender1" PopupControlID="Popup1" TargetControlID="Button1" BackgroundCssClass="modalBackground" runat="server" />
    <asp:LinkButton ID="LinkButton1" CommandName="Popup" runat="server">Popup</asp:LinkButton>
  </ItemTemplate>
</asp:TemplateField>

Codebehind:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton LinkButton1 = (LinkButton)e.Row.FindControl("LinkButton1");
            LinkButton1.CommandArgument = e.Row.RowIndex.ToString();
        }
    }

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Popup" && e.CommandArgument != null)
        {
            int rowIndex = Convert.ToInt32(e.CommandArgument);
            ModalPopupExtender modalPopupExtender1 = (ModalPopupExtender)GridView1.Rows[rowIndex].FindControl("ModalPopupExtender1");
            modalPopupExtender1.Show();

            //Perform any specific processing.
            Label1.Text = string.Format("Row # {0}", rowIndex);
        }
    }

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

Страница:

<asp:TemplateField>
  <ItemTemplate>
    <asp:LinkButton ID="LinkButton1" CommandName="Popup" runat="server">Popup</asp:LinkButton>
  </ItemTemplate>
</asp:TemplateField>

Codebehind:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Popup" && e.CommandArgument != null)
        {
            int rowIndex = Convert.ToInt32(e.CommandArgument);
            ModalPopupExtender1.Show();                

            //Perform any specific processing
            Label1.Text = string.Format("<Br>Row # {0}", rowIndex);
        }
    }

Спасибо, удачи!

...