2014-06-18 56 views
0

我顯示彙總行作爲最後一行。我想在用戶點擊列標題時排除該行排序。通過使用sql union我將總列添加到我的結果中。我正在使用SQL,C#和DataGridView控制。我無法公開ColumnHeader_Click事件。我只使用TableStyle[0].AllowSorting = false。我如何在控件上應用自定義排序?排除彙總行排序綁定DataGridView

感謝

+0

我會說,在你的聯盟中添加另一個隱藏的列。所有的記錄都是1,你的總記錄是2.然後,當你在你的'Dataview'中排序時,總是先按該列排序,然後再按所有其他列排序。 –

回答

0

該解決方案是基於@ T.S.的建議,而是直接工作在DataSet中,而不是在SQL。

我已經在VS2013中測試過它;我不知道這是否會在NET 1.1工作,就必須重振非常老的機器來測試..

我不知道你的

的意思我不能顯示columnheader_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(); 
} 
1

謝謝TaW,你的回答對我有幫助。我的需求有點不同,我需要Total出現在頂部,並且始終保留排序列,因爲我的網格具有高度的交互性,可以對所呈現的數據進行過濾和更改。

我的排序是通過

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(); 

附註:我不得不使用會話來保存自定義排序而不是ViewState,因爲這是不正確的與我的GridView中的動態創建按鈕