wpf C1FlexGrid 关于ComBox列ESC操作
代码:(代码画面是ComBoxWindow, 具体处理在ComBoxWindow.cs中)
如图所示的操作选择发生变化后,按ESC后,目的是还原到选择前的值,可是现在却把ComBox的数据源里的值改变了,如何修正这种情况 回复 1楼q406157290的帖子
谢谢您提供的Demo以及详细的步骤。
您的问题我们收到了,测试后给您反馈。 回复 1楼q406157290的帖子
问题已经重现。
我们需要调查您的程序是哪里出了问题。有结果会在第一时间反馈给您。 回复 3楼Alice的帖子
好的谢谢您我发现的是按ESC只把SelectItem里的Name修改成原始数据,但是Id没有变更,所以才导致这种情况 回复 4楼q406157290的帖子
好的,谢谢您的反馈。 回复 1楼q406157290的帖子
经过调查,建议您当取消改变的时候,重新计算ComboBox list。
以下是建议的代码:
void populateList()
{
//ComBox数据源
DataListVM.ComBoxList.Add(new ComBoxModel() { Id = "1", Name = "111" });
DataListVM.ComBoxList.Add(new ComBoxModel() { Id = "2", Name = "222" });
DataListVM.ComBoxList.Add(new ComBoxModel() { Id = "3", Name = "333" });
}
private void C1FlexGrid_CellEditEnding(object sender, C1.WPF.FlexGrid.CellEditEventArgs e)
{
C1FlexGrid grid = sender as C1FlexGrid;
if (e.CancelEdits)
{
//Person p = grid.Rows.DataItem as Person;
//p.ComBoxSelectItem = DataListVM.ComBoxList;
DataListVM.ComBoxList.Clear();
populateList();
}
}
请参考附件的Demo。 原因是因为C1ComboBox的绑定模式是双向绑定,而其中的Name属性又绑定到C1FlexGrid的ComBox列,采用的也是默认的双向绑定模式;这样当C1FlexGrid修改该列的值时,会直接修改C1ComboBox的数据源;
当下拉框修改选项后,按下ESC时,根据下拉框的按键事件判断:
private void header_TextBoxKeyUp(object sender, KeyEventArgs e)
{
Key key = e.Key;
if (key != Key.Return)
{
if (key != Key.Escape)
{
if (key != Key.F4)
{
return;
}
if (!KeyboardUtil.Alt)
{
this.IsDropDownOpen = !this.IsDropDownOpen;
e.Handled = true;
}
}
else if (this.IsDropDownOpen)
{
this.IsDropDownOpen = false;
this._elementComboHeader.IsInEditMode = true;
e.Handled = true;
return;
}
}
else
{
if (this._filterItem != null && this.SelectedItem == null && this.Condition == Condition.Contains && base.Items.Count > 0)
{
this.SelectedItem = base.Items;
this.ClearFilterItemVisualState();
}
if (this.IsDropDownOpen)
{
this.IsDropDownOpen = false;
}
this._elementComboHeader.IsInEditMode = false;
this._elementComboHeader.IsInEditMode = true;
if (!this.isFound)
{
this._elementComboHeader._elementEditControl.Select(this._elementComboHeader._elementEditControl.Text.Length, 0);
return;
}
}
}
其中并没有将C1ComboBox还原到之前选项操作,这时候下拉框还是最新的选项,而同时触发C1FlexGrid的ESC还原旧值事件,将该单元格的值设置成旧值,导致直接更新了C1ComboBox当前最新选项的Name,变成之前的旧值了。。。。
参考解决方案如下:
1、采用Alice方案,简单有效直接;
2、参考如下代码:
private ComBoxModel _PreSelectedItem;
void flx_PrepareCellForEdit(object sender, CellEditEventArgs e)
{
if (flx.Columns.Header == "ComBox")
{
_PreSelectedItem = (flx.Rows.DataItem as Person).ComBoxSelectItem;
C1ComboBox cmb = (e.Editor as Border).Child as C1ComboBox;
cmb.KeyDown -= cmb_KeyDown;
cmb.KeyDown += cmb_KeyDown;
}
}
void cmb_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
C1ComboBox cmb = sender as C1ComboBox;
cmb.SelectedItem = _PreSelectedItem;
flx.FinishEditing(true);
e.Handled = true;
}
} 回复 7楼KNight的帖子
非常感谢大家给我的建议,在提问前我有自己的方法,只不过不满意,所以问下,我的方法是如下,在按Esc的时候把ComBox里的SelectedValue 设置会原始数据
public void c1DataGrid1_CellEditEnding(object sender, CellEditEventArgs e)
{
C1FlexGrid flexGrid = sender as C1FlexGrid;
//原数据
Object PreSelectedValue = 111;
Border bdr = flexGrid.ActiveEditor as Border;
if (bdr != null)
{
C1.WPF.C1ComboBox comboBox = bdr.Child as C1.WPF.C1ComboBox;
if (comboBox != null)
{
if (e.CancelEdits)
{
comboBox.SelectedValue = PreSelectedValue;
}
}
}
}
回复 6楼Alice的帖子
谢谢您的建议 回复 9楼q406157290的帖子
不用客气
页:
[1]