Не могу, кажется, скрыть TableRow на обратной передаче AJAX - PullRequest
1 голос
/ 22 января 2010

Я хотел бы скрыть / показать TableRow через ASP.NET AJAX, когда установлен флажок.

У меня есть этот код для флажка:

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
  <asp:CheckBox runat="server" ID="cbViewPages" Checked="true" OnCheckedChanged="OnViewPages"  AutoPostBack="true"/>
</ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="cbViewPages" EventName="CheckedChanged"/>
  </Triggers>
</asp:UpdatePanel>

и это для TableRow

  <asp:TableRow runat="server" ID="PagesRow">
    <asp:TableCell VerticalAlign="Middle">Test Row</asp:TableCell>
  </asp:TableRow>

Этот метод вызывается при нажатии флажка:

  protected void OnViewPages(object sender, EventArgs e)
  {
    if(cbViewPages.Checked)
    {
      PagesRow.Visible = true;
    }
    else
    {
      PagesRow.Visible = false;
    }
  }

OnViewPages определенно вызывается, я вижу это через отладчик. И если я удаляю код AJAX, OnViewPages будет скрыт / не скрыт при необходимости.

Почему эта функция скрытия / отображения не работает с кодом AJAX?

Doh! У меня есть частичный ответ, TableRow не находится в панели обновления. Но вы не можете поместить UpdatePanel вокруг TableRow. Так что это мой новый вопрос, как разместить UpdatePanel вокруг TableRow?

Ответы [ 2 ]

1 голос
/ 22 января 2010

Пара вариантов. Вы можете поместить панель обновлений вокруг всей таблицы (это то, что предлагает Петрас). Вы также можете использовать JavaScript для этого. В случае, если ваш флажок установлен / снят, просто позвоните

ScriptManager.RegisterStartupScript(Me, Me.GetType(), "setRowVisibility", "setRowVisibility(" & IIf(cbViewPages.Checked, "true", "false") & ");", True)

Это вызовет функцию JavaScript, которую вы можете определить на своей странице следующим образом:

function setRowVisiblity(visible) {
  var row = document.getElementById('<%=PagesRow.ClientID %>');
  if (visible) {
    row.style.display = 'table-row';
  } else {
    row.style.display = 'none';
  }
}

Это НАМНОГО более эффективно, чем использование и панель обновления, но это немного больше работы. Я предпочитаю эффективность, но это только я. :)

0 голосов
/ 22 января 2010

Вот решение: Страница ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

<asp:ScriptManager ID="scriptMgr" runat="server" />


<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
  <asp:CheckBox runat="server" ID="cbViewPages" Checked="true" OnCheckedChanged="OnViewPages"  AutoPostBack="true"/>


<asp:Table runat="server">

<asp:TableRow>
<asp:TableCell>123</asp:TableCell>
</asp:TableRow>

<asp:TableRow runat="server" ID="PagesRow">
<asp:TableCell>Row To Hide</asp:TableCell>
</asp:TableRow>
</asp:Table>

</ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="cbViewPages" EventName="CheckedChanged"/>
  </Triggers>
</asp:UpdatePanel>


</form>
</body>
</html>

Код за страницей:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;

public partial class index : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  }

  protected void OnViewPages(object sender, EventArgs e)
  {
    if(cbViewPages.Checked)
    {
      PagesRow.Visible = true;
    }
    else
    {
      PagesRow.Visible = false;
    }
  }
}
...