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


Автор: alir 26.12.2006, 19:30
Есть GridView, в ней объявил событие RowEditing.
Код

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:GridView ID="CompanyView" runat="server"... OnRowEditing="CompanyView_RowEditing">
...

Код

protected void CompanyView_RowEditing(object sender, GridViewEditEventArgs e)
 { }

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

На самом деле иногда он вызывался, но потом совсем перестал. Даже после обновления aspnet_wp.exe.

Автор: Mymik 26.12.2006, 19:59
alir, у тебя на кнопке Edit что ты создал где-то внутри GridView стоит CommandName="Edit" ??? и еще у тебя должны быть  поля EmptyDataTemplate если ты собираешься редактировать данные средствами данного GridView.

Автор: alir 27.12.2006, 00:00
Цитата

у тебя на кнопке Edit что ты создал где-то внутри GridView стоит CommandName="Edit" ???

Это как? Edit так создаю: 
Код

<asp:CommandField EditText="Edit" ShowEditButton="True" />


Цитата

и еще у тебя должны быть  поля EmptyDataTemplate если ты собираешься редактировать данные средствами данного GridView.

Это где и зачем это?

Автор: Mymik 27.12.2006, 10:23
Цитата(alir @  27.12.2006,  00:00 Найти цитируемый пост)
Цитата

и еще у тебя должны быть  поля EmptyDataTemplate если ты собираешься редактировать данные средствами данного GridView.

Это где и зачем это? 

Sorry тут я лажанулся :о) я занимался своим делом и у меня в буфере была эта строка, а первая буква совпадает с тем что я хотел написать и я не заметил случайно :о)

Код

    <asp:GridView ID="test" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                     <!-- Тут ты располагаешь все выводы данных типа Eval("ID")-->
                        <%# Eval("name") %>
                    <asp:Button CommandName="Edit" runat="server" />
                </ItemTemplate>
                <EditItemTemplate>
                     <!-- Тут располагаются поля которые будут отображаться при редактировании, т.е. ты можешь написать так -->
                      <asp:TextBox id="txtEditName" Text='Eval("name")' runat="server" />
                </EditItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>


Вот так вот это делается, чтобы все это сохранить, тебе нужно будет еще одна кнопка в GridView с CommandName="Update". И надо будет еще определить метод для OnRowUpdating (OnRowUpdated срабатывает после OnRowUpdating)

Автор: alir 27.12.2006, 14:41
Mymik
Если делать как ты говоришь, то вылетает ошибка:
Цитата

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation. 


На самом деле определение события OnRowEditing должно сразу вызывать режим редактирования с кнопками update и cancel. Сначала он так и делал, но потом перестал, и я не понимаю почему.

Автор: Mymik 27.12.2006, 14:51
Так и не смог вспомнить :о(... я как-то раньше делал просто через CommandName...
Вобщем вот другое решение -->>
Код

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="gvTest" OnRowEditing="gvTest_RowEditing" OnRowUpdating="gvTest_RowUpdating" 
             OnRowCancelingEdit="gvTest_RowCancelingEdit" AutoGenerateColumns="false" runat="server">
            <Columns>
                <asp:TemplateField HeaderText="Name">
                    <ItemTemplate>
                        <%# HttpUtility.HtmlDecode(Eval("name").ToString()) %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtEditName" Text='<%# Eval("name")%>' runat="server" />
                    </EditItemTemplate>
                    
                </asp:TemplateField>
                <asp:CommandField EditText="edit" ShowEditButton="true" ButtonType="Button" />
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>


Код

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    private static DataTable table = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            CreateTable();
    }

    private void CreateTable()
    {
        DataColumn col = new DataColumn();
        col.ColumnName = "name";
        col.DataType = typeof(string);
        table.Columns.Add(col);

        for (int i = 0; i < 10; i++)
        {
            DataRow row = table.NewRow();
            row["name"] = "name" + i.ToString();

            table.Rows.Add(row);
        }
        DataBind();
    }
    protected void gvTest_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gvTest.EditIndex = e.NewEditIndex;
        DataBind();
    }

    protected void gvTest_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        table.Rows[e.RowIndex]["name"] = HttpUtility.HtmlEncode(((TextBox)(gvTest.Rows[e.RowIndex].FindControl("txtEditName"))).Text);
        gvTest.EditIndex = -1;
        DataBind();
    }
    protected void gvTest_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        gvTest.EditIndex = -1;
        DataBind();
    }
    public override void  DataBind()
    {
        gvTest.DataSource = table;
        gvTest.DataBind();
        base.DataBind();
    }
}


Автор: alir 10.1.2007, 13:28
Подход имеет место быть, но вручную добавлять поля редактирования для каждой ячейки не катит, ведь грид все это долже делать сам. 
Проблема так и не решена. Вот в MSDN:
GridView.RowEditing Event 
Цитата

Occurs when a row's Edit button is clicked, but before the GridView control enters edit mode. 

У меня он в режим редактирования не переходит (просто происходит обновление страницы), а должен.
Что надо сделать, чтобы он его выполнил? Подскажите плз.

Автор: dazy 10.1.2007, 21:05
Цитата(alir @  27.12.2006,  17:41 Найти цитируемый пост)
На самом деле определение события OnRowEditing должно сразу вызывать режим редактирования с кнопками update и cancel.

Сомневаюсь. Скорее даже наоборот. Если определена какая либо команда, которая перерводит таблицу в режим редактирования, то происходит событие OnRowEditing, добаляя код в это событие ты вносишь свою логику в это действо.
Поэтому Mymik верно говорит, в том плане, что у тебя внутри Грида должна быть кнопка у которой свойство CommandName = "Edit"; такого плана
Код

        <asp:GridView ID="GridView1" runat="server">
            <Columns>
                <asp:ButtonField CommandName="Edit" Text="Button" />
            </Columns>
        </asp:GridView>

Так же верно, что такие кнопки (поля) придется добавлять для команд update и cancel (insert грид не поддерживает, но можно эмулировать). Но можно воспользоваться возможностью грида автоматом добавлять эти поля. Для  этого нужно связать грид с датасорсом и тогда появляется возможность автоматом добавлять пейджинг, редактирование, сортировку.
Ты покажи код своей таблицы целиком, и покажи где ты вызываешь режим редактирования, может найдем в чем проблема....

Цитата

Occurs when a row's Edit button is clicked, but before the GridView control enters edit mode. 


Все очень просто, значит у тебя не происходит a row's  Edit button is clicked, т.е. то на чем ты кликаешь, не есть a row's  Edit button. 

Автор: alir 11.1.2007, 16:59
Ну вот, например, если так делать, тоже режим не включается:

Код

 <asp:GridView ID="CompanyView" runat="server" OnRowEditing="CompanyView_RowEditing">
            <Columns>
                <asp:ButtonField CommandName="Edit" Text="Button" />
            </Columns>
</asp:GridView>

Автор: Naum 11.1.2007, 17:18
Код

<%--  Display the data in the body of the page. --%>
<body style="font: 10pt verdana">
   <form runat="server">
      <h3><font face="Verdana">Updating a Row of Data.</font></h3>
      <span id="Message" EnableViewState="false" 
         style="font:arial 11pt;" runat="server"/><p>
      <ASP:DataGrid id="MyDataGrid" runat="server"
         Width="800"
         BackColor="#ccccff" 
         BorderColor="black"
         ShowFooter="false" 
         CellPadding=3 
         CellSpacing="0"
         Font-Name="Verdana"
         Font-Size="8pt"
         HeaderStyle-BackColor="#aaaadd"
         OnEditCommand="MyDataGrid_Edit"
         OnCancelCommand="MyDataGrid_Cancel"
         OnUpdateCommand="MyDataGrid_Update"
         DataKeyField="au_id"
      >
      <Columns>
         <ASP:EditCommandColumn EditText="Edit" CancelText="Cancel" 
            UpdateText="Update"/>
      </Columns>
   </ASP:DataGrid>
</form>
</body>

Код отсюда - http://msdn.microsoft.com/library/RUS/cpguide/html/cpconupdatingdatainsqldatabase.asp
Для того, чтобы вызывался режим редактироваия DataGrid, получается, нужна процедура MyDataGrid_Edit, которую можно найти по той же ссылке
Код

 public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E)
   {
      MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
      BindGrid();
   }

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