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

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

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

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

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

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

В ASP.Net Ajax должно быть что-то для упрощения отдельных элементов управления, как это делает Telerik Ajax Manager, но что делать, если я не хочу использовать тяжелые и дорогостоящие элементы управления Telerik.

user606274 07.02.2011 13:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
14 977
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

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

Если бы вы видели мою форму, я думаю, вы бы поняли. Он очень похож на сетку, как и большинство корпоративных форм ввода данных. На мой взгляд, размещение этого с использованием всех div и float было бы очень болезненно. Тем не менее, спасибо за подсказку.

jeremcc 10.12.2008 20:18

ознакомьтесь с макетом причудливых форм (погуглите) или developer.yahoo.com/yui/grids. Это не такая большая боль, как вы думаете. Я создал множество приложений для интрасети, каждое из которых имеет формы.

Rob Allen 10.12.2008 20:22

Интересно ... Я просто знаю, что разложить вручную сложно, но, возможно, с хорошей библиотекой, может быть, я стану новообращенным. ;-) Спасибо.

jeremcc 10.12.2008 20:25

Совсем неплохо с тегом Fieldset (навороченные формы).

Rob Allen 10.12.2008 21:03

Да, я это видел. Не совсем библиотека, а техника. Я попробую, когда у меня будет возможность. Еще раз спасибо.

jeremcc 10.12.2008 21:09

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

Bryan Rehbein 12.12.2008 02:30

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

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

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

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

jeremcc 12.12.2008 23:08

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>

Отображение / скрытие - всего лишь один пример. У меня есть и другие области, в которых я фактически обновляю данные ... например, обновляю набор связанных раскрывающихся списков, охватывающих несколько строк. Но спасибо за пример jQuery, он следующий в моем списке, чему нужно научиться.

jeremcc 12.12.2008 23:11

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

Daniel Schaffer 12.12.2008 23:38
Ответ принят как подходящий

Ответ: В конце концов, это невозможно сделать с помощью 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, но работает.

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

Вы МОЖЕТЕ обновить TD-части таблицы, если сама таблица также находится внутри Updatepanel !!

Не знаю почему. Меня устраивает.

<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>  

Код 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;
}

Привет и добро пожаловать в SO. Пожалуйста, постарайтесь объяснить свой ответ словами, а не только кодом. И поскольку вы отвечаете на вопрос трехлетней давности, на который уже давали ответ несколько раз, расскажите, пожалуйста, чем ваш ответ отличается от других ответов.

Olle Sjögren 07.11.2012 12:50

Другие вопросы по теме