none
如何触发DataList控件的OnUpdateCommand和oncancelcommand事件? RRS feed

  • 问题

  • 我用的是DataList控件,当单击ItemTemplate模板中CommandName="edit" 按钮时可以触发oneditcommand事件,
    但是当单击EditItemTemplate模板中的 CommandName="cancel" 按钮和 CommandName="update"按钮时就不能触发事件,请问是什么原?
    这是绑定的代码:      
     <asp:DataList ID="DataList1" runat="server"
                DataKeyField="CategoryID" DataSourceID="SqlDataSource1"
                oneditcommand="DataList1_EditCommand"
                onupdatecommand="DataList1_UpdateCommand"
                oncancelcommand="DataList1_CancelCommand">

     
    2009年8月23日 3:36

答案

  • 据我所知,很多服务器控件依赖的 Viewstate ,如果您设置 EnableViewState = false 时,他们可能不工作

    知识改变命运,奋斗成就人生!
    2009年8月23日 10:18
    版主
  • 您好,服务器控件依靠ViewState来记录控件的状态和数据
    如果禁用enableViewState,则表示页面在postbacK时不传递控件的状态和数据。
    自然就无法触发需要这些数据的事件。
    2009年8月23日 11:28
    版主

全部回复

  • 在ItemCommand 事件中判断 
    protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
    {
        if (e.CommandName == "cancel")
        {
             //
        }
        else if (e.CommandName == "update")
        {
             //
        }
    


    知识改变命运,奋斗成就人生!
    2009年8月23日 3:44
    版主

  • 谢谢回复,那如果照着上面说的写的话,DataList 控件中像oncancelcommand 这样的属性就没用了吗?
    我是按照这里说的做的
    如何:允许用户编辑 DataList Web 服务器控件中的项(http://msdn.microsoft.com/zh-cn/library/90xwe9s3.aspx)

      我的后台代码是这样写的,这是直接通过vs2008生成的。为什么 DataList1_EditCommand可以绑定到事件下面2个就不可以呢
      protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
        {
          .........
        }

        protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
        {
          ...........
       
        }

        protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
        {
           .........
        }
    2009年8月23日 3:52
  • 你把CommandName 分别改为字首大写试试,Update, Cancel 另外你可以从MSDN例子上对比一个看看是哪里的问题
    知识改变命运,奋斗成就人生!
    2009年8月23日 3:58
    版主
  • MSDN上的例子都试过了,还是不可以触发。网络上也搜索到有人遇到过类似问题但都没解决。
    2009年8月23日 7:07
  • 你可以把你的代码帖出来看看
    知识改变命运,奋斗成就人生!
    2009年8月23日 7:15
    版主
  • <script runat="server">
    protected void DataList1_EditCommand(object source,
        DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = e.Item.ItemIndex;
        DataList1.DataBind();
    }

    protected void DataList1_CancelCommand(object source,
        DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = -1;
        DataList1.DataBind();
    }

    protected void DataList1_UpdateCommand(object source,
        DataListCommandEventArgs e)
    {
        String categoryID =
             DataList1.DataKeys[e.Item.ItemIndex].ToString();
        String categoryName =
             ((TextBox)e.Item.FindControl("textCategoryName")).Text;
        String description =
             ((TextBox) e.Item.FindControl("textDescription")).Text;

        SqlDataSource1.UpdateParameters["original_CategoryID"].DefaultValue
            = categoryID;
        SqlDataSource1.UpdateParameters["categoryName"].DefaultValue
            = categoryName;
        SqlDataSource1.UpdateParameters["Description"].DefaultValue
            = description;
        SqlDataSource1.Update();

        DataList1.EditItemIndex = -1;
        DataList1.DataBind();
    }

    protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {

    }
    </script> 
    <form id="form1" runat="server">
        <div>
            <br />
            <asp:DataList runat="server"
                DataKeyField="CategoryID"
                DataSourceID="SqlDataSource1" ID="DataList1"
                OnEditCommand="DataList1_EditCommand"
                OnCancelCommand="DataList1_CancelCommand"
                OnUpdateCommand="DataList1_UpdateCommand"
                onitemcommand="DataList1_ItemCommand">
                <EditItemTemplate>
                    ID: <asp:Label ID="Label1" runat="server"
                             Text='<%# Eval("CategoryID") %>'>
                        </asp:Label>
                    <br />
                    Name: <asp:TextBox ID="textCategoryName" runat="server"
                             Text='<%# Eval("CategoryName") %>'>
                          </asp:TextBox>
                    <br />
                    Description: <asp:TextBox ID="textDescription"
                                     runat="server"
                            Text='<%# Eval("Description") %>'>
                         </asp:TextBox>
                    <br />
                    <asp:LinkButton ID="LinkButton1" runat="server"
                        CommandName="Update" >
                        Save
                    </asp:LinkButton>
                    &nbsp;
                    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Cancel"> 
                        Cancel
                    </asp:LinkButton>
                </EditItemTemplate>
                <ItemTemplate>
                    CategoryID:
                    <asp:Label ID="CategoryIDLabel" runat="server"
                        Text='<%# Eval("CategoryID") %>'>
                    </asp:Label>
                    <br />
                    CategoryName:
                    <asp:Label ID="CategoryNameLabel" runat="server"
                         Text='<%# Eval("CategoryName") %>'>
                    </asp:Label>
                    <br />
                    Description:
                    <asp:Label ID="DescriptionLabel" runat="server"
                        Text='<%# Eval("Description") %>'>
                    </asp:Label>
                    <br />
                    <asp:LinkButton runat="server" ID="LinkButton1"
                        CommandName="Edit" >
                        Edit
                    </asp:LinkButton><br />
                </ItemTemplate>
            </asp:DataList>

            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                  ConnectionString=
                     "<%$ ConnectionStrings:NorthwindConnectionString %>"
                SelectCommand="SELECT [CategoryID], [CategoryName],
                     [Description] FROM [Categories]"
                UpdateCommand="UPDATE [Categories] SET [CategoryName] =
                     @CategoryName, [Description] = @Description
                     WHERE [CategoryID] = @original_CategoryID">
                <UpdateParameters>
                   <asp:Parameter Name="CategoryName" Type="String" />
                  <asp:Parameter Name="Description" Type="String" />
                  <asp:Parameter Name="original_CategoryID" Type="Int32" />
                </UpdateParameters>
            </asp:SqlDataSource>
        </div>
      </form>

    MSDN的一个演示
    2009年8月23日 7:22
  • 你重新创建个空站试试看
    2009年8月23日 7:31
  • 我新建了一个空站website_2在文件Datalist_UpdateCommand.aspx中把上面的代码拷贝过去运行是可以的

    我又重新打来原来的网站website_0,从"添加现有项"中把Datalist_UpdateCommand.aspx文件添加进去再次运行就不行了.

    当我把website_0中的web.config文件覆盖到新建的网站website_2中时再次运行Datalist_UpdateCommand.aspx发现又不可以了。

    谢谢各位老师了,终于知道问题的原因了是因为我在website_0的web.config文件的 pages节点中设置了 enableViewState="false"
    <pages enableViewState="false">

    只是不知道为什么我设置了enableViewState="false" 后就不能触发DataList的

    OnUpdateCommand和oncancelcommand事件

    事件了呢?还请老师指点下。

    这是网络上的一个帖子:
    http://topic.csdn.net/u/20071107/11/d5670a8f-16d5-4a9e-8075-c9d42515e911.html
    2009年8月23日 7:54
  • 我新建了一个空站website_2在文件Datalist_UpdateCommand.aspx中把上面的代码拷贝过去运行是可以的

    我又重新打来原来的网站website_0,从"添加现有项"中把Datalist_UpdateCommand.aspx文件添加进去再次运行就不行了.

    当我把website_0中的web.config文件覆盖到新建的网站website_2中时再次运行Datalist_UpdateCommand.aspx发现又不可以了。

    谢谢各位老师了,终于知道问题的原因了是因为我在website_0的web.config文件的 pages节点中设置了 enableViewState="false"
    <pages enableViewState="false">

    只是不知道为什么我设置了enableViewState="false" 后就不能触发DataList的

    OnUpdateCommand和oncancelcommand事件

    事件了呢?还请老师指点下。

    这是网络上的一个帖子:
    http://topic.csdn.net/u/20071107/11/d5670a8f-16d5-4a9e-8075-c9d42515e911.html

    你禁用视图了因为控件功能的视图没发送到页面里面隐藏状态数据  造成某些功能失效的 所以回调时候需要那些生成的页面操作数据视图post到服务器 处理当前页面业务  如果没有这些的话 服务器不知道当前操作哪个 所以照当初页面处理了
    • 已编辑 mldark 2009年8月23日 11:30
    2009年8月23日 8:43
  • 据我所知,很多服务器控件依赖的 Viewstate ,如果您设置 EnableViewState = false 时,他们可能不工作

    知识改变命运,奋斗成就人生!
    2009年8月23日 10:18
    版主
  • 您好,服务器控件依靠ViewState来记录控件的状态和数据
    如果禁用enableViewState,则表示页面在postbacK时不传递控件的状态和数据。
    自然就无法触发需要这些数据的事件。
    2009年8月23日 11:28
    版主