gpt4 book ai didi

c# - Gridview - 排序事件不起作用

转载 作者:行者123 更新时间:2023-11-30 17:03:16 30 4
gpt4 key购买 nike

我有一个可编辑的 GridView,我正在尝试将排序功能添加到指定的列。虽然我没有收到任何错误,但我的排序方法不起作用。我可以就我在这里缺少的东西获得一些帮助吗?

设计:

<asp:GridView ID="gvLogNotice" 
runat="server"
AutoGenerateColumns="false"
ShowFooter="false"
OnRowCancelingEdit="gvLogNotice_RowCancelingEdit"
OnRowEditing="gvLogNotice_RowEditing"
OnRowUpdating="gvLogNotice_RowUpdating"
EmptyDataText="There are no data records to display."
DataKeyNames="LogNoticeID"
AllowPaging="true"
AllowSorting="true"
OnSorting="gvLogNotice_sorting"
Width="700px">
<Columns>
<asp:TemplateField HeaderText="Log No." Visible="false">
<ItemTemplate>
<%#Eval("LogNoticeID")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtLogNoticeID" runat="server" Enabled="false" Text=' <%#Eval("LogNoticeID") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Log Date" SortExpression="DateLogged">
<ItemTemplate>
<%#Eval("DateLogged")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtDateLogged" runat="server" Text=' <%#Eval("DateLogged") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Log Description" HeaderStyle-Width="50px" sortexpression="LogNoticeDescript">
<ItemTemplate>
<%#Eval("LogNoticeDescript")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtLogNoticeDescript" runat="server" Text=' <%#Eval("LogNoticeDescript") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Responsible Party" sortexpression="ResponsibleParty">
<ItemTemplate>
<%#Eval("ResponsibleParty")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtResponsibleParty" runat="server" Text=' <%#Eval("ResponsibleParty") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Planned Date" SortExpression="PlannedDate" >
<ItemTemplate>
<%#Eval("PlannedDate")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtPlannedDate" runat="server" Text=' <%#Eval("PlannedDate") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Case Number" SortExpression="CaseNumber">
<ItemTemplate>
<%#Eval("CaseNumber")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtCaseNumber" runat="server" Text=' <%#Eval("CaseNumber") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Log Status" SortExpression="LogStatus">
<ItemTemplate>
<%#Eval("LogStatus")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtLogStatus" runat="server" Text=' <%#Eval("LogStatus") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Edit">
<ItemTemplate>
&nbsp;&nbsp;
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="images/edit.png" Width="25"
Height="25" CommandName="Edit" />&nbsp;&nbsp;
<%-- <asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/img/delete.png" CommandName="Delete"
OnClientClick="return confirm('Are you sure want to delete record?')" />--%>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CommandName="Update">Update</asp:LinkButton>&nbsp;&nbsp;
<asp:LinkButton ID="LinkButton2" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

代码隐藏:

//页面加载事件:

 protected void Page_Load(object sender, EventArgs e)
{
lblmsg.Text = "";
if (!Page.IsPostBack)
{
gvLogNotice.ShowFooter = false;
//Load grid data using common method
LoadGrid();


}
}

//绑定(bind)数据到GV并加载

void LoadGrid()
{
sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
sqlcmd.CommandType = CommandType.StoredProcedure;
try
{
sqlcon.Open();
da = new SqlDataAdapter(sqlcmd);
dt.Clear();
da.Fill(dt);
gvLogNotice.DataSource = dt;
gvLogNotice.DataBind();


}
catch (Exception ex)
{

}
finally
{
sqlcon.Close();
}
}

//排序事件

  protected void gvLogNotice_sorting(object sender, GridViewSortEventArgs e)
{
switch (e.SortExpression)
{
case "DateLogged":
if (e.SortDirection == SortDirection.Ascending)
{
LoadGrid();
}
else
{
LoadGrid();
}

break;

}

}

最佳答案

只有当 GridView 使用 DataSourceID 属性绑定(bind)到 DataSource 控件时,GridView 上的 SortDirection 属性才会更改。否则,需要手动管理排序方向。

在这种情况下,当我们使用其 DataSource 属性向 gridView 提供数据时,e.SortDirection 将始终返回 Ascending因此只有您的 IF 语句会始终被执行。

第二点::您实际上需要优化的只是确保您定义了一个函数来仅返回数据。例如说 LoadGrid() 只返回 DataTable。 这样您就不需要定义 LoadGrid() 方法的重载。而且,如果实现方式得当,重载是完全不需要的。

第三点:: 是您根本没有应用排序,而只是加载 GridView。当您通过设置 DataSource 属性并调用 手动进行数据绑定(bind)时code>DataBind(),需要手动处理排序操作。

因此,首先将您的 sortDirection 存储在 ViewState 中。只需定义一个公共(public)属性即可获取/设置相同的属性。 [ 注意 我们需要根据上面第 1 点存储 sortDirection 值 ]

public SortDirection SortDirection    
{
get {
if (ViewState["SortDirection"] == null)
{
ViewState["SortDirection"] = SortDirection.Ascending;
}
return (SortDirection)ViewState["SortDirection"];
}
set
{
ViewState["SortDirection"] = value;
}
}

在您的 OnSorting 事件中,设置 sortDirection 并首先对表格进行排序,然后将其加载到 gridView。

 protected void SortRecords(object sender, GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
string direction = string.Empty;
if (SortDirection == SortDirection.Ascending)
{
SortDirection = SortDirection.Descending;
direction = " DESC";
}
else
{
SortDirection = SortDirection.Ascending;
direction = " ASC";
}
DataTable table = this.LoadGrid(); // or this.GetDataTable(), to get only the DataTable
// Now apply Sorting to your source of Data
table.DefaultView.Sort = sortExpression + direction;
// Bind the GridView
gvLogNotice.DataSource = table;
gvLogNotice.DataBind();
}

最后,您的 LoadGrid 没问题,只是填充表格并返回它

private DataTable LoadGrid()
{
DataTable dt = new DataTable();
sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
sqlcmd.CommandType = CommandType.StoredProcedure;
try
{
sqlcon.Open();
da = new SqlDataAdapter(sqlcmd);
dt.Clear();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{}
}

关于c# - Gridview - 排序事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795787/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com