排序 GridView 时 C# 无限循环
C# infinite loop when sorting GridView
我想在 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 中生成数据源。
我的排序方式是:
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
,因为它确实会进入无限循环。
您应该做的是处理排序。当您查看 MSDN 中的示例时,您会发现您必须对网格视图后面的数据集进行排序。
例如,如果您有 DataTable
,您应该将其排序为:
DataTable dt; // define your data table
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
GVEquipe.DataSource = dt;
GVEquipe.DataBind();
我想在 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 中生成数据源。
我的排序方式是:
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
,因为它确实会进入无限循环。
您应该做的是处理排序。当您查看 MSDN 中的示例时,您会发现您必须对网格视图后面的数据集进行排序。
例如,如果您有 DataTable
,您应该将其排序为:
DataTable dt; // define your data table
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
GVEquipe.DataSource = dt;
GVEquipe.DataBind();