我正在使用devexpress,并且有一个具有多列的treelist。
默认情况下,每个客户需求都使用“升序”排序来呈现数据。
问题
我有一个按钮应该禁用列的排序。我使用这两个属性:"OptionsColumn.AllowSort“和SortOrder。问题是,即使我设置了OptionsColumn.AllowSort = false,但由于我有一个SortOrder of Ascending,所以在更改列值时仍然会触发一个排序。
我发现,如果我将OptionsColumn.AllowSort = false和SortOrder更改为None,这将给出所需的行为,但当将sortOrder更改为None时,会触发一种使客户感到困惑的排序。
我想要的:
简单地说,我需要“冻结”排序,这意味着当用户单击"DisableSorting“时,列表将不像将sortOrder更改为"none”时一样,它将保持原样,并且当更改排序不应该触发的值时。
代码
DisableButton:
private void DisableSorting_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
foreach (var c in xtlItemList.Columns)
{
c.OptionsColumn.AllowSort = false; // disable sorting on all columns
}
EnableSorting= false; // global variable indicating that the sorting shoult be disabled
}treeList startSorting事件:
private void xtlItemList_StartSorting(object sender, EventArgs e)
{
try
{
var tree = (MatrixXTreeList)sender;
DevExpress.XtraTreeList.Columns.TreeListColumn col = tree.GetSortColumn(0);
if (EnableSorting == true) // if sorting enabled
{
var treeTest = (MatrixXTreeList)sender;
DevExpress.XtraTreeList.Columns.TreeListColumn col2 = treeTest.GetSortColumn(0);
if (col != null)
SetSortColumnID((MatrixXTreeList)sender, afterUpdate);
else
{
col.SortOrder = SortOrder.None;
}
}
else
{
col.SortOrder = SortOrder.None; // if sorting diabled,
//problem still triggers a sort since the SortOrder is changed from Ascending to None
}
}
catch (Exception ex)
{
}
}我如何完成期望的行为?
发布于 2019-01-09 13:45:41
多亏@Svetlana,我设法解决了这个问题。解决办法如下:
首先,我希望保持列值不变,因此我通过执行以下操作实现了这一点:
public List<string> myValues= new List<string>();
int count = xtlItemList.Nodes.Count; // number of nodes in three
for (int i = 0; i < count; i++)
{
var columnID1 = xtlItemList.Columns[2]; // get the column with index of 2
var cellValue = xtlItemList.Nodes[i][columnID1]; // get value
myStrings.Add(cellValue.ToString()); // save value
}
// change sort order
xtlItemList.BeginSort();
xtlItemList.Columns[2].SortOrder = SortOrder.None;
xtlItemList.EndSort();
// return the values
for (int i = 0; i < myStrings.Count; i++)
{
var columnID1 = xtlItemList.Columns[2];
xtlItemList.Nodes[i].SetValue(columnID1, myStrings[i]);
}然而,
以上内容可能是错误的,因为我会给每一行提供错误的值。由于排序被更改,所以行被重新排列,因此这些值不属于相应的排序行。
我解决了这个问题,方法是将节点保存在列表中,然后在排序之后设置节点的位置,如下所示:
int count = xtlItemList.Nodes.Count;
List<TreeListNode> nodes = new List<TreeListNode>();
nodes.AddRange(xtlItemList.Nodes); // save the nodes with their position
xtlItemList.BeginSort();
xtlItemList.Columns[2].SortOrder = SortOrder.None;
xtlItemList.EndSort();
for (int i = 0; i < nodes.Count; i++)
{
xtlItemList.SetNodeIndex(nodes[i], i); // set nodes to the original position
}https://stackoverflow.com/questions/54107322
复制相似问题