Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > GridView режим редактирования


Автор: cupper 5.10.2010, 11:28
Есть проект, нужно было добавить возможность редактировать выводимые через грид значения.
Ну по msdn добавил кнопки, события, определил обработчики. Итог в редим редактирования не входит. 
хмм...
Посмотрел на соседнюю страницу через Web там был переход к редактированию, лезу в код, вижу что также объявлены кнопки, НО
события OnRowEditing, OnRowCanceling нету, нету и их обработчиков. Объявлены только OnRowCommand, onRowUpdating, OnRowDataBound. после тщательного просмотра кода, дебага, я так и непонял как/почему данные грид переходит в режим редактирования по клацанию кнопки,  без обработчиков, а мой ни с обработчиками ни без них (вылазит исключение что не объявлен обработчик для OnRowEditing) не фурычит... 
Вот даже и незнаю что за хитрости таит в себе грид и где бы про сею магию почитать, поэтому прошу помощи у знающих.

Автор: Springtime 5.10.2010, 12:24
AJAX?

Автор: cupper 5.10.2010, 12:39
не слова в коде про ajax я не увидел, самый обычный грид
Код

<asp:GridView id="gvDictionaryType" runat="server" Width="100%" BorderWidth="1" OnRowDeleting="gvDictionaryType_RowDeleting" 
__designer:wfdid="w1" OnRowDeleted="gvDictionaryType_RowDeleted" HorizontalAlign="Center" BorderColor="#132846" CellPadding="2"
 CellSpacing="0" DataSourceID="odsDictionaryType" PageSize="20" AutoGenerateColumns="False" DataKeyNames="ID" AllowPaging="True"
 PagerStyle-HorizontalAlign="center" OnRowDataBound="gvDictionaryType_RowDataBound"
 OnPageIndexChanging="gvDictionaryType_PageIndexChanging" OnPreRender="gvDictionaryType_PreRender">
                <HeaderStyle CssClass="TableHeaderStyle" />
                <RowStyle CssClass="TableRowStyle" />
                <AlternatingRowStyle CssClass="TableAlternatingRowStyle" />
                <Columns>
                    <asp:TemplateField>                        
                        <ItemTemplate>
                            <asp:CheckBox ID="cSelect" runat="server"/>
                        </ItemTemplate>
                        <ItemStyle CssClass="TableItemStyle" Width="20"/>
                    </asp:TemplateField>
                    <asp:BoundField DataField="TypeName" HeaderText="Название словаря" >
                        <ItemStyle CssClass="TableItemStyle" HorizontalAlign="Left" />
                        <HeaderStyle CssClass="TableHeaderStyle" />
                    </asp:BoundField>
                    <asp:CommandField ShowEditButton="true" ButtonType="Image" EditImageUrl="~/Images/edit.gif" CausesValidation="false" 
                        CancelImageUrl="~/Images/cancel_small.gif" UpdateImageUrl="~/Images/update.gif" 
                        EditText="Редактировать" CancelText="Отмена" UpdateText="Обновить">
                        <ItemStyle CssClass="TableItemStyle" HorizontalAlign="Center" Height="24px" Width="24px" />
                        <HeaderStyle CssClass="TableHeaderStyle" />
                    </asp:CommandField>
                    <asp:CommandField ShowDeleteButton="true" DeleteText="Удалить" ButtonType="Image" DeleteImageUrl="~/Images/del.gif" CausesValidation="false">
                        <ItemStyle CssClass="TableItemStyle" HorizontalAlign="Center" Height="24px" Width="24px" />
                        <HeaderStyle CssClass="TableHeaderStyle" />
                    </asp:CommandField>
                </Columns>
            </asp:GridView>

самый обычные обработчики
Код

    protected void gvDictionaryType_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
            if (e.Row.Cells[e.Row.Cells.Count - 1].Controls.Count > 0)
            {
                ((ImageButton)e.Row.Cells[e.Row.Cells.Count - 1].Controls[0]).Attributes.Add("onclick", Resources.FormMessage.OnDeleteButton);
                ((CheckBox)e.Row.Cells[0].Controls[1]).Attributes.Add("onclick", "javascript:changeVisible(this);");
            } 
    }

    protected void gvDictionaryType_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvDictionaryType.PageIndex = e.NewPageIndex;
    }
...

Есть страница master, есть страницы *aspx который етот мастер наследуют, в мастере обычная табличные разметка сайта. Я было думал что может это такая фишка грида что если не определять onRowEditing он чтонить стандартное применяет и все значения например через тексбоксы отображает как строки. Ну так именно на той странице где нужно без OnRowEditiing не вкакую, да и с ним не особо разницы... Я вот как бы немного опечален даже, что немогу понять такой простой истины. В интернете любые примеры только с OnRowEditing, ну как я уже понял в инете по поводу asp.net самые банальные вещи только показываются, а в проектах используются все чего нет в интете ))

Добавлено через 10 минут и 18 секунд
переход в режим редактирование по средству OnRowEditing все же сделал, бонально дописав в конце(как везде и было написано) строку
Код

gv.DataSource = ...
gv.DataBind();

но собстно я так ничего и не понял

Автор: Springtime 5.10.2010, 12:51
может это:

Код

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "Delete":
this.GridView1.DeleteRow(Convert.ToInt32(e.Command Argument));
break;
}
}

Автор: cupper 5.10.2010, 13:30
Не совсем. Да, OnRowCommand там объявлен, и есть везде его обработчики, но они обрабатывают только специфические кнопки (которые добавлялись как например
Код

<asp:ButtonField ButtonType="Button" CommandName="FieldTable" >

я тщательно их все продебужил даты явно убедиться что не в одну из веток свича при клацании на edit не заходит.
Тут видимо всетаки наверно фишка всего проекта, что мол оно так хитроповернуто (или специально переделано) что оно вот так может работать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)