【问题标题】:C# infinite loop when sorting GridView对 GridView 进行排序时的 C# 无限循环
【发布时间】:2015-05-27 01:49:47
【问题描述】:

我想在 CodeBehind 中对我的 GridView 进行排序,但我的排序方法给了我一个无限循环。

我的 GridView,用于测试,如下所示:

<asp:GridView ID="GVEquipe" OnRowDataBound="GVEquipe_RowDataBound"  OnSorting="GridView_Sorting"    AllowSorting="true" AutoGenerateColumns="False" DataKeyNames="Employee" runat="server">
<Columns>
    <asp:HyperLinkField DataTextField="Employee" DataNavigateUrlFields="Employee" DataNavigateUrlFormatString="~/Profil.aspx?No_Emp={0}" HeaderText="No d'employé" SortExpression="Employee" />
    <asp:BoundField DataField="FirstName" HeaderText="Prénom" SortExpression="FirstName" />
    <asp:BoundField DataField="Name" HeaderText="Nom" SortExpression="Name" />
    <asp:BoundField DataField="Machine" HeaderText="Machine" SortExpression="Machine" />
    <asp:TemplateField HeaderText="Infractions" SortExpression="Alerte">
        <ItemTemplate>
            <asp:ImageButton ID="IBAlerte" runat="server" ImageUrl='<%# Convert.ToDouble(Eval("Alerte")) >= 5d ? "~/Images/alerte3.PNG" : Convert.ToDouble(Eval("Alerte")) < 3d ? "~/Images/alerte0.PNG" : "~/Images/alerte2.PNG" %>' CommandArgument='<%# Bind("Employee") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Événements" >
        <ItemTemplate>
            <asp:ImageButton ID="IBDelai" ImageUrl="~/Images/loupe.png" runat="server" />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

我在 Page_Load 中生成 DataSource。

我的排序方式是:

    protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        GridView gv = (GridView)sender;            
        gv.Sort(e.SortExpression, e.SortDirection);
    }

我将其设为通用,因为我会将其用于同一页面中的其他 GridView。

编辑: 我改变了很多东西,现在它可以工作了。

protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
    sortDirection = e.SortDirection;
    GridView gv = (GridView)sender;
    if (gv.ID == "GVEquipe")
        equipeColumnToSort = e.SortExpression;
    DataSource();
}

我使用局部变量如:

最后,在我的 DataSource() 方法的最后,我订购了我的 DataSource(IEnumerable 类型):

if (!String.IsNullOrEmpty(equipeColumnToSort))
{
    switch (equipeColumnToSort)
    {
        case "Employee":
            listEquipes = listEquipes.OrderBy(x => x.Employee);
            break;
        case "FirstName":
            listEquipes = listEquipes.OrderBy(x => x.FirstName);
            break;
        case "Name":
            listEquipes = listEquipes.OrderBy(x => x.Name);
            break;
        case "Machine":
            listEquipes = listEquipes.OrderBy(x => x.Machine);
            break;
        case "Alerte":
            listEquipes = listEquipes.OrderBy(x => x.Alerte);
            break;
    }
    if (sortDirection == SortDirection.Descending)
        listEquipes = listEquipes.Reverse();                
}

【问题讨论】:

  • 你是从 sort 内部调用 sort?
  • 根据排序方向用更新的数据源重新绑定网格

标签: c# asp.net gridview gridview-sorting


【解决方案1】:

您不应该从该事件内部调用Sort,因为它确实会进入无限循环。

应该做的是处理排序。当您查看MSDN 的示例时,您会发现您必须对网格视图后面的数据集进行排序。

例如,如果你有一个DataTable,你应该像这样对其进行排序:

DataTable dt; // define your data table

dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
GVEquipe.DataSource = dt;
GVEquipe.DataBind();

【讨论】:

  • @felix:需要更多帮助吗?
  • 它有什么问题?
  • 我在设置 DataTable 时遇到了一些困难。我这样做:“DataTable dt = Session["TaskTable"] as DataTable;"我在生成数据源的方法中设置了会话,例如:“Session[”TaskTable”] = GVEquipe.DataSource;”但是当方法退出时,会话丢失:"+ base {"Impossible d'accéder à un objet supprimé.\r\nNom de l'objet : 'Accès à DataContext après Dispose.'."} System.InvalidOperationException {System. ObjectDisposedException}"
  • 你应该展示你的整个代码。我想你现在可以访问聊天,所以让我们看看你是否可以把它放在那里。 (嗯,不,你不能。没有足够的代表聊天......你能用代码发布一个新问题吗?)
  • 对不起,你还不能,因为你没有足够的代表。我会发布一个新问题来解决您的代码问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2011-09-30
相关资源
最近更新 更多