【问题标题】:GridView client side paging not workingGridView 客户端分页不起作用
【发布时间】:2014-09-21 17:47:28
【问题描述】:

使用来自其他程序的数据(例如,在此代码中,我使用随机数数组 - 就像来自其他程序的查询数据)。将其查询到DataTable 并绑定到GridView + 为所有行添加删除按钮。

单击删除按钮时-此按钮无效(使用button.Enabled = false;UpdatePanel 等按钮单击我有“旧”数组都很好用)。 但是当我使用分页时 - 我每次都有“新”数组。

如何解决?我需要 - 在第一页我单击按钮 - 他们变得不活动,然后我选择第二页,然后在第一页返回并看到带有不活动按钮的“旧”数组。

aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.WebForm1" %>

<!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></title>
    </head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
    <asp:UpdatePanel ID="Up1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDeleted="GridView1_RowDeleted"
            OnRowDeleting="GridView1_RowDeleting" OnDataBinding="GridView1_DataBinding" AllowPaging="true" PageSize="10" OnPageIndexChanging="GridView1_PageIndexChanging">
            <Columns>
                <asp:BoundField DataField="Name" ItemStyle-Width="200px">
                    <ItemStyle Width="200px"></ItemStyle>
                </asp:BoundField>
                <asp:BoundField DataField="Number" ItemStyle-Width="200px">
                    <ItemStyle Width="200px"></ItemStyle>
                </asp:BoundField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <asp:Button ID="Button2" runat="server" Text="Button" onclick="Button2_Click" OnClientClick="return DeleteConfirm();" />
                                <asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Bind("Name") %>' />

                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </ItemTemplate>
                </asp:TemplateField>



            </Columns>
        </asp:GridView>
        </ContentTemplate>
        </asp:UpdatePanel>
        <br />
        <br />
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Reset" />
    </div>
    </form>
    <script type="text/javascript">
        function DeleteConfirm() {
            if (confirm("Are you sure you want to delete this customer from excluded customer list ?")) {
                return true;
            }
            return false;
        }
    </script>
</body>
</html>

aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace WebApplication1
{

        public partial class WebForm1 : System.Web.UI.Page
        {
            private  DataTable _Source;

            public WebForm1()
            {
                ResetData();
            }

            private  void ResetData()
            {
               _Source = new DataTable();
               _Source.Columns.Add("Name", typeof(string));
                _Source.Columns.Add("Number", typeof(string));
                Random rn = new Random();
                for (int t = 0; t < 100; t++)
                {
                    _Source.Rows.Add(rn.Next(1, 10).ToString(), rn.Next(1, 10).ToString());
                }

            }

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

            protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
            {

            }

            protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {
                _Source.Rows.RemoveAt(e.RowIndex);
                //GridView1.DataBind();
                Response.Redirect("~/WebForm1.aspx");
            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                ResetData();
                GridView1.DataBind();
            }

            protected void GridView1_DataBinding(object sender, EventArgs e)
            {
                GridView1.DataSource = _Source;
            }

            protected void Button2_Click(object sender, EventArgs e)
            {
                var button = sender as Button;
                button.Enabled = false;
                var hidden = button.Parent.FindControl("HiddenField2") as HiddenField;
                var name = hidden.Value;
                DeletForName(name);
            }

            protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
            {
                GridView1.PageIndex = e.NewPageIndex;
               // GridView1.DataSource = _Source;
                //GridView1.DataBind();

            }
            private  void DeletForName(string name)
            {
                foreach (DataRow row in _Source.Rows)
                    if (row["Name"].Equals(name))
                    {
                      _Source.Rows.Remove(row);
                        break;
                    }
            }
        }
    }

【问题讨论】:

    标签: c# javascript asp.net arrays gridview


    【解决方案1】:

    您基本上需要在请求之间存储数据源。一种选择是使用Session 变量:

    public partial class WebForm1 : System.Web.UI.Page
        {
            private DataTable _Source;
    
            public WebForm1()
            {
            }
    
            private void ResetData()
            {
                _Source = new DataTable();
                _Source.Columns.Add("Name", typeof(string));
                _Source.Columns.Add("Number", typeof(string));
                Random rn = new Random();
                for (int t = 0; t < 100; t++)
                {
                    _Source.Rows.Add(rn.Next(1, 10).ToString(), rn.Next(1, 10).ToString());
                }
    
                Session["data"] = _Source;
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    ResetData();
                    GridView1.DataBind();
                }
                _Source = Session["data"] as DataTable;
            }
    
            protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
            {
    
            }
    
            protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {
                ((DataTable)Session["data"]).Rows.RemoveAt(e.RowIndex);
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                ResetData();
                GridView1.DataBind();
            }
    
            protected void GridView1_DataBinding(object sender, EventArgs e)
            {
    
                GridView1.DataSource = _Source;
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                var button = sender as Button;
                button.Enabled = false;
                var hidden = button.Parent.FindControl("HiddenField2") as HiddenField;
                var name = hidden.Value;
                DeletForName(name);
            }
    
            protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
            {
    
                GridView1.PageIndex = e.NewPageIndex;
                GridView1.DataBind();
    
            }
            private void DeletForName(string name)
            {
    
                foreach (DataRow row in _Source.Rows)
                    if (row["Name"].Equals(name))
                    {
                        _Source.Rows.Remove(row);
                        break;
                    }
            }
        }
    

    基本上在页面加载时,如果不是回发,它会创建一个新的DataTable 并将其存储在 Session 变量中。如果是回发,它会从 Session 变量中提取已经存在的数据。另外,您只想在需要创建新的DataTable 时调用您的ResetData 函数,所以我将它从构造函数中取出。

    此外,请确保您的实际数据源的 Name 列是唯一的,因为您的删除函数将删除具有您要查找的名称的第一行,而不一定是您选择删除的行。

    希望这会有所帮助!

    编辑

    两种可能性。我认为最有可能的是您希望将已删除的数据保留在表中,但只需将其标记为已删除并在 gridview 中禁用其删除按钮。为此,我的直觉是在表中添加一个布尔列,指示行是否已被删除。然后当一行被数据绑定时,检查它是否已被删除并相应地禁用按钮:

    private void DeletForName(string name)
    {
    
        foreach (DataRow row in _Source.Rows)
            if (row["Name"].Equals(name))
            {
                row["Deleted"] = true;
                break;
            }
    }
    
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((bool)((System.Data.DataRowView)e.Row.DataItem)["Deleted"])
            {
                ((Button)e.Row.FindControl("Button2")).Enabled = false;
            }
        }
    }
    

    如果您想从表中删除项目,但仍禁用已删除行索引处的按钮,那会稍微复杂一些。如果是这种情况,请告诉我,我可以尝试提供帮助,但上述内容似乎更有可能是您想要的。

    【讨论】:

    • 非常感谢!它可以工作,但按钮不起作用(((例如,我单击第一页中的删除按钮 - 确认 - 按钮变为非活动状态,我选择第二页,然后返回第一页 - 此按钮处于活动状态((
    • 没有意识到我可以对自己的帖子发表评论,抱歉。请参阅我上面的编辑以回应您的评论。希望我在正确的轨道上,让我知道。另外请记住,删除函数在示例代码中并不能真正正常工作,因为数据表中的 name 列不包含唯一数据。 @e1s
    • 谢谢,我尝试在我的解决方案中这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多