Динамическое обновление строк в таблице HTML с помощью UpdatePanel

В последнее время я часто использую элемент управления ASP.NET AJAX UpdatePanel для некоторых приложений интрасети, над которыми я работал, и по большей части я использую его для динамического обновления данных или скрытия и отображения элементов управления в форме на основе действия пользователя.

Есть одно место, где у меня были небольшие проблемы, и мне интересно, есть ли у кого-нибудь совет. Моя форма использует довольно типичный макет на основе таблицы, где таблица используется для отображения сетки меток и полей для заполнения пользователем. (Я уже знаю, что некоторые люди избегают макетов на основе таблиц, и я понимаю все за и против. Но это мой выбор, поэтому, пожалуйста, не отвечайте «Не используйте макет на основе таблиц».)

Теперь моя проблема заключается в том, что бывают случаи, когда я хочу обернуть UpdatePanel вокруг набора строк, чтобы я мог скрывать и отображать их динамически, но UpdatePanel на самом деле не позволяет вам это сделать. Основная проблема заключается в том, что он оборачивает их в div, а, насколько я знаю, вы не можете обернуть div вокруг строк таблицы. Это недействительный HTML.

Таким образом, то, как я с этим сталкивался, состоит в том, чтобы полностью сделать мои динамические строки частью совершенно новой таблицы, что нормально, но тогда вам придется иметь дело с выравниванием всех столбцов вручную с таблицей над ней, и это настоящая болезненный и довольно хрупкий.

Итак, вопрос... знает ли кто-нибудь о каком-либо методе динамического создания или обновления строк с использованием UpdatePanel или чего-то подобного? Надеюсь, решение будет почти таким же простым, как добавление UpdatePanel на страницу, но даже если нет, я все равно хотел бы его услышать.


person jeremcc    schedule 10.12.2008    source источник
comment
ASP.Net Ajax должен иметь что-то для ajaxify отдельных элементов управления, как это делает Telerik Ajax Manager, но что, если я не хочу использовать тяжелые и дорогостоящие элементы управления Telerik.   -  person    schedule 07.02.2011


Ответы (7)


UpdatePanel отображается как тег DIV и поэтому недействителен между строками таблицы. Если все, что вы хотите, это скрыть содержимое, сохранив (очень-очень плохой) макет таблицы, включите тег стиля в строку с ASP-переменной для значения видимости, например:

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

Затем вы манипулируете видимой переменной по мере необходимости.

Тем не менее, отбрасывание правильного макета вредит вам здесь.

person Rob Allen    schedule 10.12.2008
comment
Если бы вы видели мою форму, я думаю, вы бы поняли. Он очень похож на сетку, как и большинство корпоративных форм ввода данных. На мой взгляд, выкладывать это, используя все div и float, было бы очень болезненно. Так сказать спасибо за подсказку. - person jeremcc; 10.12.2008
comment
ознакомьтесь с причудливым макетом форм (погуглите) или developer.yahoo.com/yui/grids . Это не такая большая боль, как вы думаете. Я создал множество приложений для интрасети, и все они имеют формы. - person Rob Allen; 10.12.2008
comment
Интересно... Я просто знаю, что выкладывать вручную сложно, но, возможно, с хорошей библиотекой, возможно, я стану новообращенным. ;-) Спасибо. - person jeremcc; 10.12.2008
comment
Совсем неплохо с тегом Fieldset (причудливые формы). - person Rob Allen; 10.12.2008
comment
Точно, я это видел. Не совсем библиотека, а техника. Я попробую, когда у меня будет шанс. Спасибо еще раз. - person jeremcc; 10.12.2008
comment
Имейте в виду, что если пользователь использует источник представления (тот, который извлекает то, что в данный момент находится в DOM), все равно будут отображаться эти строки, если вы используете этот метод. - person Bryan Rehbein; 12.12.2008

UpdatePanels (или обратные передачи AJAX в целом) не следует использовать только для скрытия или отображения элементов. Если вам нужно обновить данные, это одно... но в противном случае просто используйте javascript, чтобы изменить свойство display 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>
person Daniel Schaffer    schedule 11.12.2008
comment
Показ/скрытие — это всего лишь один пример. У меня есть и другие области, в которых я также обновляю данные... например, обновляю набор связанных раскрывающихся списков, охватывающих несколько строк. Но спасибо за пример jQuery, он следующий в моем списке вещей, которые нужно изучить. - person jeremcc; 12.12.2008
comment
jQuery также упростит обновление таблицы, поскольку с помощью прямой панели UpdatePanel нет хорошего способа обновить отдельные строки без перезагрузки/перепривязки всей таблицы. С помощью jQuery вы сможете добавлять/удалять/перемещать/любые отдельные строки, если это то, что вы хотите сделать. - person Daniel Schaffer; 12.12.2008

Если вы динамически создаете элементы управления, вы можете решить, что отображать, а что скрывать при создании элементов управления.

Вы также можете делать такие вещи:

<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 непосредственно в таблице.

person Bryan Rehbein    schedule 11.12.2008
comment
Вопрос конкретно связан с использованием UpdatePanel для обновления строк в качестве частичного обновления страницы. Если бы я обновлял всю страницу, то да, то, что вы говорите, было бы хорошо. - person jeremcc; 12.12.2008

Ответ: В конце концов, сделать это с помощью UpdatePanel невозможно. Лучшее, чего вы можете добиться, это обновить всю таблицу, но не отдельные строки.

person jeremcc    schedule 19.02.2009

У меня была такая же проблема, и я наткнулся на решение.

Вы МОЖЕТЕ обновить 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>  
person dio    schedule 26.05.2012

АСП-код:

<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;
}
person MSR    schedule 07.11.2012
comment
Привет и добро пожаловать в SO. Пожалуйста, попробуйте объяснить свой ответ словами, а не только кодом. И поскольку вы отвечаете на вопрос трехлетней давности, на который уже отвечали несколько раз, расскажите, пожалуйста, чем ваш ответ отличается от других ответов. - person Olle Sjögren; 07.11.2012

В нашем проекте мы нашли некоторое решение этой проблемы. Нам пришлось создавать сложные отчеты с множеством активных элементов в каждой строке (кнопки для редактирования, принять и т.д.).

Мы создали 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, но работает.

person Marek Kwiendacz    schedule 19.04.2011