q406157290
发表于 2015-8-24 13:07:00
回复 10楼KNight的帖子
忘记了 给你说的这种事没有联动的效果 我这边是要实现选择行时跟别的联动
当拖拽的时候我没有能控制住表头拖拽 时保持颜色
KNight
发表于 2015-8-24 15:32:00
回复 11楼q406157290的帖子
没理解您表达的内容:-|
q406157290
发表于 2015-8-24 15:39:00
回复 12楼KNight的帖子
表头可以拖拽着更换 顺序
也就是DraggedColumn事件
上面的比如SortedColumn中把SelecteItems设置回去触发SelectionChanged后发现SelecteItems是设置的数目
可是在DraggedColumn事件里做同样的处理触发SelectionChanged后发现SelecteItems的数目是1
这样导致选择多行的带背景色的数据就变成只有一条数据带有背景色了
你有好办法解决这问题吗
Alice
发表于 2015-8-24 17:55:00
回复 13楼q406157290的帖子
你好。
你的业务逻辑越复杂,你需要写的代码就越多,也就越复杂。
有关你整个逻辑方面的问题,我没有可以提供的帮助。
但我有个在排序、分组和过滤后保存住selection多选的方案,供你参考:
该方案就是抽出SaveSelection/RetainSelection的方法,对grid.Selection进行操作。在过滤、分组和排序前后都分别调用该方法进行保存选择和重置选择。
q406157290
发表于 2015-8-25 08:27:00
回复 14楼Alice的帖子
謝謝回复 拿你的demo 坐标头拖拽以你的方式实现还是无法保持颜色不变化您有好的建议吗 就是表头拖拽 交换位置
gw0506
发表于 2015-8-25 17:22:00
一样的思路,你在拖拽列头开始的事件里SaveSelection,拖拽完了RetainSelection。
KNight
发表于 2015-8-25 21:01:00
回复 15楼q406157290的帖子
在ColumnReordering中调用SaveSelection,在ColumnReordered中调用RetainSelection;:~ 看着为了一个需求,加了那么多事件,怪累人的......
:~ 突然发现,由C1FlexGrid变成DataGrid了......上面说的ColumnReordering和ColumnReordered事件是C1DataGrid的,C1FlexGrid的貌似照这个思路无法实现......
q406157290
发表于 2015-8-26 08:40:00
回复 16楼gw0506的帖子
有写同样的方法但是无法实现请您自己试下
q406157290
发表于 2015-8-26 08:41:00
回复 17楼KNight的帖子
谁说不是呢为了一个背景色的设置要控制好多事件 如果能有别的简单的方法 谁还这么麻烦呢 只能说C1并没有想象中的那么好而且我主要是针对C1FlexGrid 的
C1FlexGrid和C1DataGrid 事件也是有区别的
为了实现这么一个背景色的设置用了这么多的事件 难道就没有别的方法了吗
KNight
发表于 2015-8-26 09:35:00
回复 19楼q406157290的帖子
:-| 控件不是万能的......C1FlexGrid主要是在DraggedColumn事件之后又会触发SelectedChanged事件,所以想了如下解决办法:
除了加上之前的那些事件,把DataGrid的ColumnReordering事件和ColumnReordered事件换成C1FlexGrid的DraggingColumn事件和DraggedColumn事件,并仍在DraggingColumn事件里调用SaveSelection方法保存选中状态;然后在DraggedColumn事件里标记当前是拖动状态结束,并在C1FlexGrid的SelectedChanged事件里对该状态进行判断处理,如果为true则调用RetainSelection方法回复选中状态即可;
参考代码如下:
List<int> hashCode = new List<int>();
private bool m_DraggedFlag = false;
public void SaveSelection()
{
hashCode.Clear();
foreach (var info in flex.SelectedItems)
{
hashCode.Add(info.GetHashCode());
}
}
public void RetainSelection()
{
flex.SelectionChanged -= flex_SelectionChanged;
if (hashCode.Count > 0)
{
flex.SelectedItems.Clear();
}
foreach (var row in flex.Rows)
{
int code = row.DataItem.GetHashCode();
if (hashCode.Contains(code))
{
row.Selected = true;
}
}
flex.SelectionChanged += flex_SelectionChanged;
}
private void flex_DraggingColumn(object sender, CellRangeEventArgs e)
{
SaveSelection();
}
private void flex_DraggedColumn(object sender, CellRangeEventArgs e)
{
m_DraggedFlag = true;
}
private void flex_SelectionChanged(object sender, CellRangeEventArgs e)
{
if (m_DraggedFlag)
{
RetainSelection();
m_DraggedFlag = false;
}
}
其他事件照旧,如果需要的话;