asp.net jquery добавить строку (клонировать строку) с текстовым полем и раскрыть динамически - PullRequest
5 голосов
/ 23 августа 2010

Когда пользователь щелкает по атрибуту поля ввода, строку (т.е. необходимо добавить строку с 2 выпадающим списком и текстовым полем) необходимо динамически создавать с указанным выше рядом с помощью jquery (чтобы не было обратной записи).Пользователю будет разрешено добавлять столько attirbutes, сколько он пожелает, и когда он нажимает на флажок, эту строку необходимо удалить.Как этого можно добиться с помощью jquery.

 <asp:Panel ID="pnl_BoxAttr" runat="server">
          <table>
             <tr>
                 <th>
                      Name
                  </th>
                  <th>
                      Comparision
                  </th>
                  <th>
                      Value
                  </th>
                  <th>
                      Delete
                  </th>
              </tr>
               <tr>
                   <td>
                       <asp:DropDownList ID="ddl_BoxName" runat="server">
                               <asp:ListItem Value="attr1" Selected="True"></asp:ListItem>
                               <asp:ListItem Value="attr2"></asp:ListItem>
                               <asp:ListItem Value="attr3"></asp:ListItem>
                       </asp:DropDownList>
                  </td>
                  <td>
                      <asp:DropDownList ID="ddl_BoxComparision" runat="server">
                             <asp:ListItem Value="=" Selected="true"></asp:ListItem>
                             <asp:ListItem Value=">"></asp:ListItem>
                             <asp:ListItem Value="<"></asp:ListItem>
                             <asp:ListItem Value="Like"></asp:ListItem>
                             <asp:ListItem Value="!="></asp:ListItem>
                             </asp:DropDownList>
                   </td>
                  <td>
                               <asp:TextBox ID="btn_boxval" runat="server" ></asp:TextBox>

                   </td>
                   <td>
                         <asp:CheckBox ID="chk_DeleteBoxRow" runat="server" />
                   </td>
             </tr>
             <tr>
                 <td colspan="3"> 
                     <asp:Button ID="btn_AddAttr" Text="Add Box Attribute" runat="server"/>
                 </td>
             </tr>
        </table>
        </asp:Panel>

Ответы [ 2 ]

8 голосов
/ 02 сентября 2010

Для начала, вот рабочая демонстрация, на которую вы можете ссылаться в моем ответе: http://jsfiddle.net/EuyB8/.

Очевидно, что демонстрационная версия находится в простом HTML, а не в ASP.NET, но я постараюсь устранить различия.

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

<tr id="TemplateRow">
    <td>
        <asp:DropDownList ID="ddl_BoxName" runat="server">
            <asp:ListItem Value="attr1" Selected="True"></asp:ListItem>
            <asp:ListItem Value="attr2"></asp:ListItem>
            <asp:ListItem Value="attr3"></asp:ListItem>
        </asp:DropDownList>
    </td>
    <td>
        <asp:DropDownList ID="ddl_BoxComparision" runat="server">
            <asp:ListItem Value="=" Selected="true"></asp:ListItem>
            <asp:ListItem Value=">"></asp:ListItem>
            <asp:ListItem Value="<"></asp:ListItem>
            <asp:ListItem Value="Like"></asp:ListItem>
            <asp:ListItem Value="!="></asp:ListItem>
        </asp:DropDownList>
    </td>
    <td>
        <asp:TextBox ID="btn_boxval" runat="server" ></asp:TextBox>

    </td>
    <td>
        <asp:CheckBox ID="chk_DeleteBoxRow" runat="server" />
    </td>
</tr>

Затем я добавляю правило CSS следующим образом:

#TemplateRow { display:none; }

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

Последний бит разметки, который нам нужно сделать, - присвоить таблице идентификатор, чтобы мы могли манипулировать строками в нашем скрипте. Я выбрал «BoxTable».

Теперь давайте создадим наш скрипт. Поскольку вы используете .NET, важно помнить, что для любого тега с атрибутом runat="server" генерируемый атрибут идентификатора отличается от того, который вы назначаете в поле идентификатора элемента управления. Простой обходной путь для этого - сделать что-то вроде следующего:

var myClientID = '<%= myServerID.ClientID() %>';

Затем сервер выводит идентификатор клиента в строку для удобного использования в вашем сценарии.

Имея это в виду, вот наш сценарий:

var btn_AddAttr = '<%= btn_AddAttr.ClientID() %>';

$(function() {
    //attach the a function to the click event of the "Add Box Attribute button that will add a new row
    $('#' + btn_AddAttr).click(function() {
        //clone the template row, and all events attached to the row and everything in it
        var $newRow = $('#TemplateRow').clone(true);

        //strip the IDs from everything to avoid DOM issues
        $newRow.find('*').andSelf().removeAttr('id');

        //add the cloned row to the table immediately before the last row
        $('#BoxTable tr:last').before($newRow);

        //to prevent the default behavior of submitting the form
        return false;
    });

    //attach a remove row function to all current and future instances of the "remove row" check box
    $('#DeleteBoxRow').click(function() {
        //find the closest parent row and remove it
        $(this).closest('tr').remove();
    });

    //finally, add an initial row by simulating the "Add Box Attribute" click
    $('#' + btn_AddAttr).click();
});

Я думаю, что комментарии довольно подробны, но оправдано краткое объяснение нескольких пунктов:

Сначала, когда мы клонируем строку шаблона, мы передаем логическое значение функции клона. Это говорит о том, что в дополнение к элементам DOM, которые мы клонируем, мы также должны клонировать обработчики событий, прикрепленные к этим элементам, и прикреплять их к новым клонам. Это важно для того, чтобы флажок «Удалить строку» работал.

Во-вторых, когда мы клонируем строку шаблона, мы также клонируем все атрибуты всех элементов, включая идентификаторы. Мы не хотим этого, потому что это нарушает соответствие XHTML и мои проблемы с причиной. Таким образом, мы удаляем все клонированные элементы из их идентификаторов.

Наконец, поскольку вы используете кнопку отправки, важно не забывать возвращать false в событии нажатия кнопки, чтобы избежать отправки формы и возникновения обратной передачи.

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

0 голосов
/ 01 сентября 2010

Насколько я понимаю, вам нужно, чтобы пользователь вставил новую строку (точно такую ​​же, как та, что содержит выбор), нажав кнопку?

Сначала вам нужно присвоить tr с помощью кнопки добавления id, скажем, 'addTr'.

Для вставки вы можете сделать что-то вроде этого:

$('#btn_AddAttr').bind(
    'click',
    function() {
        $('#addTr').before( '<tr>' + 
                                /* entre tr content here */
                            '</tr>'
                          );
    }
);

Просто убедитесь, что все выпадающие списки и текстовые поля имеют разные идентификаторы.

Для удаления строки из таблицы вы должны добавить класс, который помог бы вам идентифицировать все флажки удаления, скажем, 'delChk':

$('.delChk').bind(
    'click',
    function() {
        $(this).closest('<tr>').remove();
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...