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;" 时,希望用户不可以自行输入一个不存在于下拉框选项中的文本;但是测试效果不是很理想:已经选择了一个值,再直接输入一个文本,默认的“--请选择--”还在,请问这个地方如何处理?
CanYou8 发表于 2016-4-21 11:43
按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开 ...
如果需要编辑和未编辑都显示下拉框, 就要同时重写CreateCellContent和CreateCellContentEditor。
你可以模仿7楼的代码。 1.据我理解,通过c1ComboBox.IsDropDownOpen属性可以打开下拉框。
你可以设置当C1ComboBox.IsKeyboardFocused 或C1ComboBox.IsKeyboardFocusWithin的时候通过属性设置打开下拉框。
2.“已经选择了一个值,再直接输入一个文本”
我理解这是业务逻辑的部分,请提供一个可以重现问题的Demo,我帮你看看。 另外对于你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); Alice 发表于 2016-4-14 13:41
另外对于你CellFactory重写的代码,我们有提供更容易实现的方法来在flexgrid 列种放置dropdown。
可以使用 ...
1.C1ComboBox.IsKeyboardFocused或C1ComboBox.IsKeyboardFocusWithin的时候设置打开下拉框,请问如何取到当前单元格中的C1ComboBox?
2.随机示例中的代码,是对整个列绑定ComboBox的吧?我这边需要的,只是这一列部分单元格绑定为ComboBox,而且每一个Cell的ComboBox下拉选项还不一样;其他单元格不变。如果用示例中的方式,能实现此种需求吗? CanYou8 发表于 2016-4-14 16:34
1.C1ComboBox.IsKeyboardFocused或C1ComboBox.IsKeyboardFocusWithin的时候设置打开下拉框,请问如何取到 ...
1.我理解您在CellFactory中已经创建了C1ComBoBox,因此可以拿到这个C1ComboBox,并挂响应的事件。
2.需要测试下才能给您反馈。 Alice 发表于 2016-4-14 17:58
1.我理解您在CellFactory中已经创建了C1ComBoBox,因此可以拿到这个C1ComboBox,并挂响应的事件。
2. ...
1.在CellFactory中创建C1ComBoBox时,如何挂获得焦点的响应的事件?
2.测试的进展如何? 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;
}
}
} 按照您提供的代码样例,我这边重写了CreateCellContentEditor然后绑定下拉,确实可以实现“聚焦时自动展开下拉”的需求。 但是这样写,在单元格未编辑时,不是显示的下拉框样子,而是普通的文本。请问,含有下拉框的单元格,如何在页面加载完毕后默认显示出下拉框的样子来? 这个你改一下CellTemplate就好了。例如
<c1:Column.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"
Foreground="Green" FontWeight="Bold"
VerticalAlignment="Center"/>
</DataTemplate>
</c1:Column.CellTemplate> gw0506 发表于 2016-4-21 12:24
这个你改一下CellTemplate就好了。例如
试了下,不行
页:
[1]
2