6

我最近一直在使用 ASP.NET AJAX UpdatePanel 控件来处理我一直在开发的一些 Intranet 应用程序,并且在大多数情况下,我一直在使用它来动态刷新数据或隐藏和显示基于表单的控件用户的操作。

有一个地方我遇到了一些麻烦,我想知道是否有人有任何建议。我的表单使用非常典型的基于表格的布局,其中表格用于显示标签和字段的网格供用户填写。(我已经知道有些人会避开基于表格的布局,我理解其利弊。但这是我做出的选择,所以请不要回答“不要使用基于表格的布局”。)

现在我的问题是,有时我想将UpdatePanel包裹在一组行周围,以便我可以动态地隐藏和显示它们,但 UpdatePanel 并没有真正让你这样做。基本问题是它在它们周围包裹了一个 div,据我所知,您不能在表格行周围包裹一个 div。它不是有效的 HTML。

所以我一直在处理它的方式是让我的动态行完全成为一个全新表的一部分,这没关系,但是你必须手动将所有列与上面的表对齐,这是一个真正的痛苦而且相当脆弱。

所以,问题是......有没有人知道使用 UpdatePanel 或类似的东西动态生成或刷新行的任何技术?希望该解决方案几乎就像在页面上放置一个 UpdatePanel 一样简单,但即使不是,我仍然希望听到它。

4

7 回答 7

5

UpdatePanel 呈现为 DIV 标记,因此在表行之间无效。如果您只想在保持(非常非常糟糕的)表格布局的同时隐藏内容,请在行中包含一个样式标记,其中包含一个 ASP var 用于可见性值,如下所示:

<tr style="display: <%= visible %>">
     <td></td>
</tr>

然后根据需要操作可见变量。

也就是说,忽略适当的布局会在这里伤害你。

于 2008-12-10T17:15:27.040 回答
3

UpdatePanels(或一般的 AJAX 回发)不应仅用于隐藏或显示元素。如果您需要更新数据,那是一回事......但除此之外,只需使用 javascript 更改显示 css 属性。

如果你使用像 jQuery 这样的客户端框架,那就更容易了——你可以这样做:

<button onclick="$('.inactive').toggle();">Toogle Inactive</button>

<table>
<tr class="inactive"><td>Inactive 1</td></tr>
<tr class="inactive"><td>Inactive 2</td></tr>
<tr><td>Active 1</td></tr>
<tr><td>Active 2</td></tr>
</table>
于 2008-12-11T23:40:01.320 回答
2

如果您正在动态创建控件,则可以在生成控件时决定显示或隐藏哪些内容。

您还可以执行以下操作:

<table>
    <tr id="row1" runat="server">
        <td>Label</td><td>Field</td>
    </tr>
</table>

从后面的代码:

row1.visible = false;

@Rob Allen 的答案的修改,这样做:

CSS

.hidden_row {
    display: none;
}

ASPX

<tr class="<%= variable %>">

同样的想法,只是使用一个类而不是将 CSS 直接编码到表中。

于 2008-12-11T23:36:07.410 回答
2

回答:最后,没有办法使用 UpdatePanel 来做到这一点。您可以实现的最佳效果是刷新整个表,而不是单个行。

于 2009-02-19T07:37:40.320 回答
2

我有同样的问题,我偶然发现了一个解决方案。

如果整个表本身也在更新面板中,您可以更新表的 TD 部分!

不知道为什么。这个对我有用。

<asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate> <table ID="Table1">
<tr>
<td >
...
</td>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<td >
....
</td>
<td >
...
</td>
<td >
...
</td>
</ContentTemplate>
</asp:UpdatePanel> 

</tr>

 </table></ContentTemplate></asp:UpdatePanel>  
于 2012-05-26T03:49:39.403 回答
2

ASP代码:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<table width="100%">
    <tr>
        <td style="width: 300px">
            Employee First Name
        </td>
        <td>
            <asp:TextBox ID="txtFname" runat="server"></asp:TextBox>
        </td>
    </tr>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <tbody>
                <tr>
                    <td style="width: 300px">
                        Date Of Birth
                    </td>
                    <td>
                        <asp:TextBox ID="txtDOB1" runat="server" OnTextChanged="txtDOB_TextChanged" AutoPostBack="true"></asp:TextBox>
                        <asp:CalendarExtender ID="txtDOB1_CalendarExtender" runat="server" Enabled="True"
                            TargetControlID="txtDOB1">
                        </asp:CalendarExtender>
                    </td>
                </tr>
                <tr>
                    <td style="width: 300px">
                        Age
                    </td>
                    <td>
                        <asp:TextBox ID="txtAge" Style="font-weight: bold; font-size: large" runat="server"
                            Enabled="false"></asp:TextBox>
                    </td>
                </tr>
            </tbody>
        </ContentTemplate>
    </asp:UpdatePanel>
    <tr>
        <td align="right" style="width: 300px">
            <asp:Button ID="btnSubmit" runat="server" CssClass="button" Text="Submit" />
        </td>
        <td>
            <asp:Button ID="btnClear" runat="server" CssClass="button" Text="Reset" />
        </td>
    </tr>
</table>

班级代码:

protected void txtDOB_TextChanged(object sender, EventArgs e)
{
    try
    {
        DateTime Today = DateTime.Now;
        DateTime DOB = Convert.ToDateTime(txtDOB1.Text);
        ArrayList arr = new ArrayList();
        arr = span(Today, DOB);
        arr[0].ToString();//For Years
        arr[1].ToString();//For Months
        arr[2].ToString();//For Days
        txtAge.Text = "Y: " + arr[0].ToString()+",M: "+arr[1].ToString()+",D: "+arr[2].ToString();

    }
    catch (Exception ex)
    {

        lblError.Text = "Error : " + ex.Message ;
    }
}
public ArrayList span(DateTime f, DateTime l)
{
    int days;
    int months;
    int years;

    int fird = f.Day;
    int lasd = l.Day;

    int firm = f.Month;
    int lasm = l.Month;

    if (fird >= lasd)
    {
        days = fird - lasd;
        if (firm >= lasm)
        {
            months = firm - lasm;
            years = f.Year - l.Year;
        }
        else
        {
            months = (firm + 12) - lasm;
            years = f.AddYears(-1).Year - l.Year;
        }
    }
    else
    {
        days = (fird + 30) - lasd;
        if ((firm - 1) >= lasm)
        {
            months = (firm - 1) - lasm;
            years = f.Year - l.Year;
        }
        else
        {
            months = (firm - 1 + 12) - lasm;
            years = f.AddYears(-1).Year - l.Year;
        }
    }


    if (days < 0)
    {
        days = 0 - days;
    }
    if (months < 0)
    {
        months = 0 - months;
    }
    ArrayList ar = new ArrayList();
    ar.Add(years.ToString());
    ar.Add(months.ToString());
    ar.Add(days.ToString());
    return ar;
}
于 2012-11-07T08:29:21.300 回答
0

在我们的项目中,我们找到了这个问题的一些解决方案。我们必须创建复杂的报告,每行中有许多活动元素(编辑、接受等按钮)。

我们创建了放置在 updatepanel 中的 div(用于在需要时更新整个表)。在这个 div 中,我们创建了带有标题定义的表,并为每一行创建了单独的表(这些表放在更新面板中)。为了在每行中创建相等的列,我们必须为每个表格单元格使用 css 类。

所以,我们有这样的东西(在每一行中,我们有几个按钮、下拉菜单、工具提示等,但为了理解我将其截断为单列的想法):

<UpdatePanel>
<DIV>
    <TABLE>
    <TR>
    <TH class="h1">Name</TH>
    </TR>
    </TABLE>

    <UpdatePanel Id='InnerPanel1'>
        <TABLE>
        <TR>
        <TD class="h1">John</TD>
        </TR>
        </TABLE>
    </UpdatePanel>
</DIV>
</UpdatePanel>

它并不优雅并且会生成大的 HTML,但是可以工作。

于 2011-04-19T22:56:35.153 回答