CanYou8 发表于 2016-4-14 10:52:20

WPF C1FlexGrid回车事件进入单元格编辑时,下拉框异常问题等

本帖最后由 CanYou8 于 2016-4-14 10:55 编辑

在CellFactory中重写了CreateCellContent方法,动态绑定下拉框,主要代码如下:
            // 绑定符合条件的参数值列为下拉框
            if (col.ColumnName == "ParamValue" && !string.IsNullOrEmpty(model.MembersCollection))
            {
                ObservableCollection<dynamic> paramValueList = new ObservableCollection<dynamic>();
                var arr = model.MembersCollection.Split(',');
                if (arr.Any())
                {
                  foreach (string i in arr)
                  {
                        paramValueList.Add(new { value = i, name = i });
                  }
                }

                C1ComboBox comboBox = new C1ComboBox();
                comboBox.VerticalAlignment = VerticalAlignment.Center;
                comboBox.HorizontalAlignment = HorizontalAlignment.Center;
                comboBox.SetResourceReference(C1ComboBox.StyleProperty, "Grid-AutoComboBox-List");
                comboBox.Width = 94;
                comboBox.IsEditable =model.OnlyChooseInput == 0;
                comboBox.DisplayMemberPath = "name";
                comboBox.SelectedValuePath = "value";
                comboBox.ItemsSource = paramValueList;
                System.Windows.Data.Binding binding = new System.Windows.Data.Binding();
                binding.Path = new PropertyPath("ParamValue");
                binding.Mode = System.Windows.Data.BindingMode.TwoWay;
                comboBox.SetBinding(C1ComboBox.TextProperty, binding);

                bdr.Child = comboBox;
                return;
            }前端.xaml文件是这样的:
            <c1:C1FlexGrid.Columns>
                <c1:Column Header="参数值" ColumnName="ParamValue" Binding="{Binding ParamValue}" Width="100"/>
            </c1:C1FlexGrid.Columns>问题1:鼠标点击编辑下拉框时正常,回车事件进入编辑状态时,下拉框所在的单元格,却变成了可编辑的文本框,如下图。如何在回车时展开此处下拉,而不是进入编辑文本框?(回车编辑单元格的具体实现见 http://gcdn.gcpowertools.com.cn/showtopic-19894-2-2.html)

问题2:当"comboBox.IsEditable = false;" 时,希望用户不可以自行输入一个不存在于下拉框选项中的文本;但是测试效果不是很理想:已经选择了一个值,再直接输入一个文本,默认的“--请选择--”还在,请问这个地方如何处理?











Alice 发表于 2016-4-21 16:56:58

CanYou8 发表于 2016-4-21 11:43
按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开 ...

如果需要编辑和未编辑都显示下拉框, 就要同时重写CreateCellContent和CreateCellContentEditor。
你可以模仿7楼的代码。

Alice 发表于 2016-4-14 12:31:19

1.据我理解,通过c1ComboBox.IsDropDownOpen属性可以打开下拉框。
你可以设置当C1ComboBox.IsKeyboardFocused 或C1ComboBox.IsKeyboardFocusWithin的时候通过属性设置打开下拉框。

2.“已经选择了一个值,再直接输入一个文本”
我理解这是业务逻辑的部分,请提供一个可以重现问题的Demo,我帮你看看。

Alice 发表于 2016-4-14 13:41:16

另外对于你CellFactory重写的代码,我们有提供更容易实现的方法来在flexgrid 列种放置dropdown。
可以使用CellFactory类new一个C1ComboBox。
详细代码可以参考随机安装示例:\Documents\ComponentOne Samples\WPF\C1.WPF.FlexGrid\CS\FlexGridSamples\Editing
仅仅需要设置列的ValueConverter,代码参考:

   col = _flexEdit.Columns["First"];
            col.ValueConverter = new ColumnValueConverter(Customer.GetFirstNames(), false);

CanYou8 发表于 2016-4-14 16:34:52

Alice 发表于 2016-4-14 13:41
另外对于你CellFactory重写的代码,我们有提供更容易实现的方法来在flexgrid 列种放置dropdown。
可以使用 ...

1.C1ComboBox.IsKeyboardFocused或C1ComboBox.IsKeyboardFocusWithin的时候设置打开下拉框,请问如何取到当前单元格中的C1ComboBox?

2.随机示例中的代码,是对整个列绑定ComboBox的吧?我这边需要的,只是这一列部分单元格绑定为ComboBox,而且每一个Cell的ComboBox下拉选项还不一样;其他单元格不变。如果用示例中的方式,能实现此种需求吗?

Alice 发表于 2016-4-14 17:58:05

CanYou8 发表于 2016-4-14 16:34
1.C1ComboBox.IsKeyboardFocused或C1ComboBox.IsKeyboardFocusWithin的时候设置打开下拉框,请问如何取到 ...

1.我理解您在CellFactory中已经创建了C1ComBoBox,因此可以拿到这个C1ComboBox,并挂响应的事件。

2.需要测试下才能给您反馈。

CanYou8 发表于 2016-4-19 23:21:37

Alice 发表于 2016-4-14 17:58
1.我理解您在CellFactory中已经创建了C1ComBoBox,因此可以拿到这个C1ComboBox,并挂响应的事件。

2. ...

1.在CellFactory中创建C1ComBoBox时,如何挂获得焦点的响应的事件?
2.测试的进展如何?

Alice 发表于 2016-4-20 11:53:01

CanYou8 发表于 2016-4-19 23:21
1.在CellFactory中创建C1ComBoBox时,如何挂获得焦点的响应的事件?
2.测试的进展如何?

如果是针对某个区域范围而不是列,不能使用随机安装示例中的方法。
只能使用CellFactory。

第一个问题当用户进入编辑模式的时候, editor没有被重写, 所以没有combo, 需要重写CreateCellContentEditor。
第二个问题是一样的由于editor没有设 导致cellcontent和celleditor不一样, 出现重叠。
针对这点,1楼提供的代码有点问题,做了修改如下:
public class MyCellFactory : CellFactory
    {
      public override void CreateCellContentEditor(C1FlexGrid grid, Border bdr, CellRange range)
      {
            base.CreateCellContentEditor(grid, bdr, range);

            var col = grid.Columns;
            if(col.ColumnName == "Align")
            {
                C1ComboBox comboBox = new C1ComboBox();
                comboBox.VerticalAlignment = VerticalAlignment.Center;
                comboBox.HorizontalAlignment = HorizontalAlignment.Center;
                comboBox.Width = 94;
                comboBox.IsEditable = true;
                comboBox.ItemsSource = Enum.GetNames(typeof(HorizontalAlignment));
                Binding binding = new Binding();
                binding.Path = new PropertyPath("Align");
                binding.Mode = BindingMode.TwoWay;
                comboBox.SetBinding(C1ComboBox.TextProperty, binding);
                comboBox.IsDropDownOpen = true;
                bdr.Child = comboBox;
            }
      }
    }

CanYou8 发表于 2016-4-21 11:43:06

按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开下拉”的需求。 但是这样写,在单元格未编辑时,不是显示的下拉框样子,而是普通的文本。请问,含有下拉框的单元格,如何在页面加载完毕后默认显示出下拉框的样子来?

gw0506 发表于 2016-4-21 12:24:12

这个你改一下CellTemplate就好了。例如
      <c1:Column.CellTemplate>
      <DataTemplate>
          <TextBlock Text="{Binding Name}"
         Foreground="Green" FontWeight="Bold"
         VerticalAlignment="Center"/>
      </DataTemplate>
      </c1:Column.CellTemplate>

CanYou8 发表于 2016-4-21 13:39:55

gw0506 发表于 2016-4-21 12:24
这个你改一下CellTemplate就好了。例如

试了下,不行
页: [1] 2
查看完整版本: WPF C1FlexGrid回车事件进入单元格编辑时,下拉框异常问题等