找回密码
 立即注册

QQ登录

只需一步,快速开始

CanYou8

银牌会员

67

主题

191

帖子

2047

积分

银牌会员

积分
2047

活字格认证微信认证勋章元老葡萄

CanYou8
银牌会员   /  发表于:2016-4-14 10:52  /   查看:9083  /  回复:13
本帖最后由 CanYou8 于 2016-4-14 10:55 编辑

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

  13.                 C1ComboBox comboBox = new C1ComboBox();
  14.                 comboBox.VerticalAlignment = VerticalAlignment.Center;
  15.                 comboBox.HorizontalAlignment = HorizontalAlignment.Center;
  16.                 comboBox.SetResourceReference(C1ComboBox.StyleProperty, "Grid-AutoComboBox-List");
  17.                 comboBox.Width = 94;
  18.                 comboBox.IsEditable =model.OnlyChooseInput == 0;
  19.                 comboBox.DisplayMemberPath = "name";
  20.                 comboBox.SelectedValuePath = "value";
  21.                 comboBox.ItemsSource = paramValueList;
  22.                 System.Windows.Data.Binding binding = new System.Windows.Data.Binding();
  23.                 binding.Path = new PropertyPath("ParamValue");
  24.                 binding.Mode = System.Windows.Data.BindingMode.TwoWay;
  25.                 comboBox.SetBinding(C1ComboBox.TextProperty, binding);

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

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











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

13 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2016-4-21 16:56:58
推荐
CanYou8 发表于 2016-4-21 11:43
按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开 ...

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

评分

参与人数 1满意度 +5 收起 理由
CanYou8 + 5 赞一个!

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-4-14 12:31:19
沙发
1.据我理解,通过c1ComboBox.IsDropDownOpen属性可以打开下拉框。
你可以设置当C1ComboBox.IsKeyboardFocused 或C1ComboBox.IsKeyboardFocusWithin的时候通过属性设置打开下拉框。

2.“已经选择了一个值,再直接输入一个文本”
我理解这是业务逻辑的部分,请提供一个可以重现问题的Demo,我帮你看看。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-4-14 13:41:16
板凳
另外对于你CellFactory重写的代码,我们有提供更容易实现的方法来在flexgrid 列种放置dropdown。
可以使用CellFactory类new一个C1ComboBox。
详细代码可以参考随机安装示例:\Documents\ComponentOne Samples\WPF\C1.WPF.FlexGrid\CS\FlexGridSamples\Editing
仅仅需要设置列的ValueConverter,代码参考:

  1.    col = _flexEdit.Columns["First"];
  2.             col.ValueConverter = new ColumnValueConverter(Customer.GetFirstNames(), false);
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
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
5#
CanYou8 发表于 2016-4-14 16:34
1.C1ComboBox.IsKeyboardFocused或C1ComboBox.IsKeyboardFocusWithin的时候设置打开下拉框,请问如何取到 ...

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

2.需要测试下才能给您反馈。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2016-4-19 23:21:37
6#
Alice 发表于 2016-4-14 17:58
1.我理解您在CellFactory中已经创建了C1ComBoBox,因此可以拿到这个C1ComboBox,并挂响应的事件。

2. ...

1.在CellFactory中创建C1ComBoBox时,如何挂获得焦点的响应的事件?
2.测试的进展如何?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-4-20 11:53:01
7#
CanYou8 发表于 2016-4-19 23:21
1.在CellFactory中创建C1ComBoBox时,如何挂获得焦点的响应的事件?
2.测试的进展如何?

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

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

  6.             var col = grid.Columns[range.Column];
  7.             if(col.ColumnName == "Align")
  8.             {
  9.                 C1ComboBox comboBox = new C1ComboBox();
  10.                 comboBox.VerticalAlignment = VerticalAlignment.Center;
  11.                 comboBox.HorizontalAlignment = HorizontalAlignment.Center;
  12.                 comboBox.Width = 94;
  13.                 comboBox.IsEditable = true;
  14.                 comboBox.ItemsSource = Enum.GetNames(typeof(HorizontalAlignment));
  15.                 Binding binding = new Binding();
  16.                 binding.Path = new PropertyPath("Align");
  17.                 binding.Mode = BindingMode.TwoWay;
  18.                 comboBox.SetBinding(C1ComboBox.TextProperty, binding);
  19.                 comboBox.IsDropDownOpen = true;
  20.                 bdr.Child = comboBox;
  21.             }
  22.         }
  23.     }
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2016-4-21 11:43:06
8#
按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开下拉”的需求。 但是这样写,在单元格未编辑时,不是显示的下拉框样子,而是普通的文本。请问,含有下拉框的单元格,如何在页面加载完毕后默认显示出下拉框的样子来?
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-4-21 12:24:12
9#
这个你改一下CellTemplate就好了。例如
  1.       <c1:Column.CellTemplate>
  2.         <DataTemplate>
  3.           <TextBlock Text="{Binding Name}"
  4.            Foreground="Green" FontWeight="Bold"
  5.            VerticalAlignment="Center"/>
  6.         </DataTemplate>
  7.       </c1:Column.CellTemplate>
复制代码
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2016-4-21 13:39:55
10#
gw0506 发表于 2016-4-21 12:24
这个你改一下CellTemplate就好了。例如

试了下,不行
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部