Добавление щелчка сервера к динамической кнопке asp в заголовке aspnet gridview

Мне нужно добавить кнопку в заголовок сетки, охватывающую два столбца. Я делаю это в коде позади:

        if (e.Row.RowType == DataControlRowType.Header)
        {
            GridView HeaderGrid = (GridView)sender;
            GridViewRow HeaderGridRow =
            new GridViewRow(0, 0, DataControlRowType.Header,
            DataControlRowState.Insert);  
            TableCell HeaderCell = new TableCell(); 
            HeaderCell.Text = "Name of Person";
            HeaderCell.Font.Bold = true;
            HeaderCell.ColumnSpan = 1;
            HeaderGridRow.Cells.Add(HeaderCell);
            HeaderCell = new TableCell();

            Button btnHeader = new Button();
            btnHeader.UseSubmitBehavior = false;
            btnHeader.Click += new EventHandler(this.btnsubmitentry_Click);
            btnHeader.Text = "Add New Task";
            btnHeader.CommandName = "AddNewTask";
            //  OnClick="btnsubmitentry_Click"
            btnHeader.CssClass = "btn btn-lg btn-default";
            btnHeader.OnClientClick = "AddNewTask();";
            HeaderCell.Controls.Add(btnHeader);
            HeaderCell.ColumnSpan = 2;
            HeaderGridRow.Cells.Add(HeaderCell);

            grdViewSummary.Controls[0].Controls.AddAt(0, HeaderGridRow);
        }

Это создает красивую кнопку, однако мне нужна помощь, как вызвать событие нажатия кнопки на стороне сервера.

<input type="button" name="grdViewSummary$ctl01$ctl00" value="Add New Task" onclick="AddNewTask();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;grdViewSummary$ctl01$ctl00&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))" class="btn btn-lg btn-default"   />

Как видите, я передал onClientClick функции javascript с кодом обратной передачи, но событие не запускается.

<script type="text/javascript">
    function AddNewTask() {
        alert();
        __doPostBack('btnsubmitentry_Click','')
    }
</script>

Я также попытался передать обработчик событий и CommandName. Но ни один из них не отображается в источнике просмотра рассматриваемой кнопки. Я буду в порядке с любым подходом; вызывая обратную передачу для функции javascript, или, вызывая процедуру щелчка на стороне сервера напрямую, или вызывает функцию grdiview с именем команды.


person Ikram M.    schedule 03.03.2015    source источник
comment
в каком случае вы создаете этот элемент управления? Обработчики событий не могут быть добавлены к динамическим элементам управления во время события обратной передачи, такого как RowDataBound   -  person fnostro    schedule 04.03.2015
comment
это исключает подход обработчика событий, поскольку этот динамический элемент управления создавался в подпрограмме gridview_rowcreated. Причина этого заключается в том, что этот элемент управления кнопки займет пространство в два столбца.   -  person Ikram M.    schedule 04.03.2015
comment
хорошо, вы можете встроить элемент управления в шаблон gridview, а затем просто изменить диапазон в созданной строке.   -  person fnostro    schedule 04.03.2015
comment
Что ты имеешь в виду? Как вставить элемент управления в HeaderText = область поля шаблона.   -  person Ikram M.    schedule 04.03.2015
comment
вы не добавляете его в ‹HeaderTemplate› ‹TemplateField› и оформляете элемент управления как обычно, и вы можете стилизовать ‹HeaderTemplate› в теге ‹HeaderStyle /› ‹TemplateField›. выложу пример   -  person fnostro    schedule 04.03.2015
comment
С# чувствителен к регистру — так написано ваше определение события? btnsubmitentry_Click (я не вижу определения в вашем образце)   -  person Tim    schedule 04.03.2015


Ответы (1)


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

<asp:TemplateField HeaderText="Name Of Person" SortExpression="parent">
    <HeaderTemplate>
        <asp:Button ID="btnHeader" runat="server" 
             OnClientClick="AddNewTask()"     <-- this is not needed see update below
             CommandName="AddNewTask"
             CssClass="btn btn-lg btn-default"
             Text="Add New Task" 
             UseSubmitBehavior="false" />
    </HeaderTemplate>
    <HeaderStyle Font-Bold="true" />
    <EditItemTemplate>
        <asp:TextBox ID="" runat="server" Text='<%# Bind(...)%>' ></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="" runat="server" Text='<%# Bind(...)%>'></asp:Label>
    </ItemTemplate>
    <FooterTemplate>
    </FooterTemplate>
</asp:TemplateField>

Обновить

Теперь, поскольку кнопка находится в заголовке, она автоматически подключается к представлению сетки, и при нажатии будет запускаться RowCommand, который может быть перехвачен в событии GridView RowCommand. Обработайте CommandName и вызовите нужные функции в коде позади

person fnostro    schedule 04.03.2015
comment
Иногда мы забываем основы - не так ли. Попробую это. RowCommand будет отличным подходом. - person Ikram M.; 04.03.2015
comment
Подключил, по нажатию кнопки ничего не сработало. Источник просмотра дает мне <th scope="col"> <input type="button" name="grdViewSummary$ctl01$btnHeader" value="Add New Task" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;grdViewSummary$ctl01$btnHeader&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))" id="grdViewSummary_btnHeader" class="btn btn-default" /> </th> - person Ikram M.; 04.03.2015
comment
Разве это не правда, брат :) Имейте в виду, что Gridview на самом деле не предназначен для операций вставки. Рассмотрите возможность использования FormView или DetailsView для вставки. - person fnostro; 04.03.2015
comment
попробуйте включить поведение отправки - person fnostro; 04.03.2015
comment
я только что создал фиктивный вид сетки с кнопкой по умолчанию в заголовке - я получаю событие rowcommand, которое я могу прервать, и просто попробовал еще раз без поведения отправки, работает в обоих направлениях. Также убедитесь, что событие OnClientClick очищено. - person fnostro; 04.03.2015
comment
У меня была группа проверки, поэтому мне также пришлось включить CausesValidation со значением false. И в созданной строке я изменил диапазон как таковой `protected void grdViewSummary_RowCreated(отправитель объекта, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.Header) { e.Row.Cells[4].ColumnSpan = 2; } ` - person Ikram M.; 05.03.2015