我如何在每一列都有三維分選的超網格?我的意思是:超網格三維分選
a。 Ascendiing - 默認升序排序指示符。
b。降序 - 由默認降序SortIndicator表示。
c。沒有排序 - 取消排列列。
注:我已經試過BeforeSortChanged事件,但我有2個問題:
我不能讓以前的列排序指標,找出當 應該停用分揀。
我有在那裏說,我們不能改變 SortIndicator在BeforeSortChange事件
我如何在每一列都有三維分選的超網格?我的意思是:超網格三維分選
a。 Ascendiing - 默認升序排序指示符。
b。降序 - 由默認降序SortIndicator表示。
c。沒有排序 - 取消排列列。
注:我已經試過BeforeSortChanged事件,但我有2個問題:
我不能讓以前的列排序指標,找出當 應該停用分揀。
我有在那裏說,我們不能改變 SortIndicator在BeforeSortChange事件
我解決了我的問題,通過使用UIElement.GetContext()在我的網格的Mouse Up事件處理程序中查找單擊的列,然後檢查並將該列的sortIndicator屬性更改爲我想要的。
編輯:
private void Grid_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
UIElement element = Grid.DisplayLayout.UIElement.ElementFromPoint(new Point(e.X, e.Y));
if (element == null)
return;
ColumnHeader clickedHeader = (ColumnHeader)element.GetContext(typeof(ColumnHeader), true);
UltraGridColumn clickedColumn;
if (clickedHeader != null)
clickedColumn = clickedHeader.Column;
if (clickedColumn == null)
return;
Switch (clickedColumn.SortIndicator)
{
case SortIndicator.Ascending :
clickedColumn.SortIndicator= SortIndicator.Descending;
break;
case SortIndicator.Descending :
clickedColumn.SortIndicator= SortIndicator.Disabled;
break;
case SortIndicator.Disabled :
default :
clickedColumn.SortIndicator= SortIndicator.Ascending;
break;
}
}
}
這不是微不足道的實施了「無序」狀態的異常。一旦數據被排序後,它就會在樂隊中重新排序。您可以通過將下面的代碼看到自己:
Infragistics.Win.UltraWinGrid.UltraGridColumn[] oldSort;
private void Sort() {
ultraGrid1.BeforeSortChange += new Infragistics.Win.UltraWinGrid.BeforeSortChangeEventHandler(ultraGrid1_BeforeSortChange);
ultraGrid1.AfterSortChange += new Infragistics.Win.UltraWinGrid.BandEventHandler(ultraGrid1_AfterSortChange);
}
void ultraGrid1_BeforeSortChange(object sender, Infragistics.Win.UltraWinGrid.BeforeSortChangeEventArgs e) {
oldSort = new Infragistics.Win.UltraWinGrid.UltraGridColumn[e.Band.SortedColumns.Count];
e.Band.SortedColumns.CopyTo(oldSort, 0);
}
void ultraGrid1_AfterSortChange(object sender, Infragistics.Win.UltraWinGrid.BandEventArgs e) {
for (int i = 0; i < oldSort.Length; i++) {
for (int j = 0; j < e.Band.SortedColumns.Count; j++) {
Infragistics.Win.UltraWinGrid.UltraGridColumn column = e.Band.SortedColumns[j];
if (column.Key == oldSort[i].Key) {
if (column.SortIndicator == Infragistics.Win.UltraWinGrid.SortIndicator.Ascending) {
//column.SortIndicator = Infragistics.Win.UltraWinGrid.SortIndicator.None;
e.Band.SortedColumns.Remove(column.Key);
j--;
break;
}
}
}
}
}
我的猜測是,你需要保持一個單獨的陣列,以在它的行索引,並重新排序行帶內。一旦分揀被刪除,根據到陣列。但我認爲這可能會耗費記憶。
另一種方法是有一個額外的隱藏列,它可以用一個簡單的for循環遞增的整數來填充。一旦列的排序被「刪除」,您只需將升序排序應用於該隱藏列。儘管如此,還有其他方面需要維護。
感謝Nyuno,但是我發現沒有任何環路我的解決方案。 –
你可以發佈那部分代碼嗎?我很好奇你是怎麼編碼的:) – Nyuno