q406157290 发表于 2016-1-20 16:36:00

wpf C1FlexGrid 关于ComBox列ESC操作





代码:(代码画面是ComBoxWindow, 具体处理在ComBoxWindow.cs中)

如图所示的操作选择发生变化后,按ESC后,目的是还原到选择前的值,可是现在却把ComBox的数据源里的值改变了,如何修正这种情况

Alice 发表于 2016-1-20 17:30:00

回复 1楼q406157290的帖子

谢谢您提供的Demo以及详细的步骤。
您的问题我们收到了,测试后给您反馈。

Alice 发表于 2016-1-21 11:16:00

回复 1楼q406157290的帖子

问题已经重现。
我们需要调查您的程序是哪里出了问题。有结果会在第一时间反馈给您。

q406157290 发表于 2016-1-21 13:34:00

回复 3楼Alice的帖子

好的谢谢您我发现的是按ESC只把SelectItem里的Name修改成原始数据,但是Id没有变更,所以才导致这种情况

Alice 发表于 2016-1-21 17:09:00

回复 4楼q406157290的帖子

好的,谢谢您的反馈。

Alice 发表于 2016-1-22 09:47:00

回复 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。

KNight 发表于 2016-1-22 11:43:00

原因是因为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;
        }
}

q406157290 发表于 2016-1-22 13:51:00

回复 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;
                  }
                }
            }

      }

q406157290 发表于 2016-1-22 13:52:00

回复 6楼Alice的帖子

谢谢您的建议

Alice 发表于 2016-1-22 17:20:00

回复 9楼q406157290的帖子

不用客气
页: [1]
查看完整版本: wpf C1FlexGrid 关于ComBox列ESC操作