C# 从对绑定的DataGridView排序中排除总计行

C# 从对绑定的DataGridView排序中排除总计行,c#,winforms,.net-1.1,C#,Winforms,.net 1.1,我将显示总计行作为最后一行。我想在用户单击列标题时从排序中排除该行。通过使用sqlunion我将total列添加到我的结果中。我正在使用SQL、C#和DataGridView控件。我无法公开ColumnHeader\u单击事件。我只使用了表样式[0]。AllowSorting=false。如何在控件上应用自定义排序 谢谢此解决方案基于@T.S.的建议,但直接在数据集中工作,而不是在SQL中 我在VS2013中进行了测试;我不知道它是否能在.NET1.1中工作,并且必须恢复一台非常旧的机器来测试它

我将显示总计行作为最后一行。我想在用户单击列标题时从排序中排除该行。通过使用
sqlunion
我将total列添加到我的结果中。我正在使用SQL、C#和
DataGridView
控件。我无法公开
ColumnHeader\u单击
事件。我只使用了
表样式[0]。AllowSorting=false
。如何在控件上应用自定义排序


谢谢

此解决方案基于@T.S.的建议,但直接在数据集中工作,而不是在SQL中

我在VS2013中进行了测试;我不知道它是否能在.NET1.1中工作,并且必须恢复一台非常旧的机器来测试它

我不知道你说的是什么意思

我无法公开columnheader\u click事件

我已将解决方案拆分为一个函数和
ColumnHeaderMouseClick
事件;如果你真的不能使用该事件,你将不得不找到另一种方法;但无论如何,您需要触发排序并决定按哪一列进行排序

解决方案的核心是设置新的列值和表达式,您可以通过它们来标识“TotalsRow”。我使用了测试表的PK列“ID”,并将“ID=1记录”推到底部。在所有行上将排序列设置为0后,适合表达式的第一行设置为maxInt

您必须将其调整为适用于结果集的表达式

我正在动态添加设置自定义排序列,并在排序后删除它;DGV暂停其布局,直到整个事件完成

DataTable yourTable = .. 

private void dataGridView1_ColumnHeaderMouseClick(object sender, 
                                                  DataGridViewCellMouseEventArgs e)
{
    string col = dataGridView1.Columns[e.ColumnIndex].Name;
    if (col != "") sortDGV (col );
 }

private void sortDGV(string col)
{
    dataGridView1.SuspendLayout();
    yourTable.Columns.Add("sortMe", typeof(Int32));

    yourTable.DefaultView.Sort = col;

    DataRow[] dr = yourTable.Select("ID='1'");
    for (int r = 0; r < yourTable.Rows.Count; r++) yourTable.Rows[r]["sortMe"] = 0;
    dr[0]["sortMe"] = int.MaxValue;

    yourTable.DefaultView.Sort = "sortMe," + col;

    yourTable.Columns.Remove("sortMe");
    dataGridView1.ResumeLayout();
}
DataTable yourTable=。。
私有void dataGridView1_ColumnHeaderMouseClick(对象发送方,
DataGridViewCellMouseEventArgs(e)
{
string col=dataGridView1.Columns[e.ColumnIndex].Name;
if(col!=“”)sortDGV(col);
}
私有void sortDGV(字符串列)
{
dataGridView1.SuspendLayout();
添加(“sortMe”,typeof(Int32));
yourTable.DefaultView.Sort=col;
DataRow[]dr=yourTable.Select(“ID='1');
对于(int r=0;r
谢谢你,你的回答帮助了我。我的需求有点不同,我需要总计显示在顶部,并始终保留排序列,因为我的网格与所呈现数据中的过滤和更改负载高度交互

我的分类是通过

protected void ReportGridView_Sorting(object sender, GridViewSortEventArgs e)
下面是我在填充GridView的方法中使用的内容:

if (!myDataTable.Columns.Contains("SortLevel"))
{
    myDataTable.Columns.Add("SortLevel", typeof(Int16));
    foreach (DataRow dr in myDataTable.Rows)
    {
        dr["SortLevel"] = 0;
    }
    dt.Rows[0]["SortLevel"] = 1;
}

if ((Session["SortDirection"] != null) && (Session["SortExpression"] != null))
{
    myDataTable.DefaultView.Sort = "SortLevel DESC, " + Session["SortExpression"] + " " + Session["SortDirection"];
}
MyGridView.DataSource = myDataTable;
MyGridView.AllowSorting = true;
MyGridView.DataBind();

旁注:我不得不使用Sessions来保存自定义排序,而不是ViewState,因为在我的gridview中动态创建的按钮无法正常工作

我想说的是,在联合中添加另一个隐藏列。所有记录将为1,总计记录将为2。然后,当您在
数据视图中排序时,总是先按该列排序,然后按所有其他列排序。