原文:解决IsEditable="True"的ComboBox在DataGrid中点击一次不能选中行的问题

此方法很笨拙,并不推荐使用!!!

此方法很笨拙,并不推荐使用!!!

此方法很笨拙,并不推荐使用!!!

事件起因,同事用了公司一个继承ComboBox的的自定义可编辑控件,但是发现这个控件在DataGrid中,当点击第一次的时候,光标到了ComboBox中,但是ComboBox所在的DataGrid行却不被选中,还是在原来的选中行上,这个问题,就导致了一些列问题,引起的问题,我们不做讨论。

经过测试,发现并不是自定义控件本身的问题,而是ComboBox只要设置了IsEditable="True",并且放在DataGrid中,就会存在这个问题,原因是,焦点在ComboBox内部的Textbox上,而没有在ComboBox自身上,看了下MSDN上的源码,如果设置了IsEditable="True",在Textbox拿到焦点以后,handled就会设置为True。

尝试重写了一下ComboBox的一些事件,但是并不起作用,百度、谷歌都走过了,也没有发现有类似相关的问题,断断续续花了两天时间,没有好的办法,最后,只能笨拙的解决这个问题了。

先看下效果图:

“好使的”列就是笨拙方法解决的,“不好使的”列就是正常的ComboBox设置了IsEditable="True"熟悉。通过效果图不难看出我刚才说的问题。

<DataGrid x:Name="dgTest" ItemsSource="{Binding MoList}" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="好使的" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="cb" IsEditable="True"ItemsSource="{Binding DataContext.DmList,RelativeSource={RelativeSource AncestorType=DataGrid}}" SelectedValue="{Binding Dm2}" SelectedValuePath="Dm" DisplayMemberPath="Dm" Text="{Binding Dm2}" GotFocus="ComboBox_GotFocus"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="不好使的" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True" ItemsSource="{Binding DataContext.DmList,RelativeSource={RelativeSource AncestorType=DataGrid}}" SelectedValue="{Binding Dm2}" SelectedValuePath="Dm" DisplayMemberPath="Dm" Text="{Binding Dm2}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
private void ComboBox_GotFocus(object sender, RoutedEventArgs e)
{for (int i = ; i < dgTest.Items.Count; i++)
{
DataGridTemplateColumn templateColumn = dgTest.Columns[] as DataGridTemplateColumn;
FrameworkElement element = templateColumn.GetCellContent(dgTest.Items[i]);
if (element!=null)
{
ComboBox combo = templateColumn.CellTemplate.FindName("cb", element) as ComboBox;
if ((ComboBox)sender == combo)
{
dgTest.SelectedIndex = i;
}
}
}
}

通过上面的代码,我相信广大的程序猿们能看出,为什么这个方法笨拙了,因为需要给DataGrid设置Name,给ComboBox设置Name、GotFocus,还要写死ComboBox所在的列标。所以,这个方法虽然解决了问题,但是,真心的不推荐大家使用,如果谁有好的方法,希望可以留言,谢谢了。

同事看到我这段代码以后,有点疑惑,不直接用IsFocused以后,进行判断。

我们将代码修改为以下的,并在if的位置打上断点,发现,无论点击哪个ComboBox,IsFocused始终是False,这是因为,TextboxFocus以后,直接拦截了,所以,没有办法继续触发。

希望,有好的解决办法的大神,给个留言,在此十分感谢了,如果,有的朋友,也遇到了这个问题,没有其他好的解决办法的话,不如尝试下,我这个笨拙的方法,最起码是解决问题了。

推荐此方法!!!

推荐此方法!!!

推荐此方法!!!

这个方法是小丁同学提供的思路,就是在ComboBox的GotFocus事件里查找父,也就是所在的行。

public static T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
{
return (T)parent;
}
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);
DataGridRow row = FindHelper.GetParentObject<DataGridRow>(this, "");
row.IsSelected = true;
}

写一个控件,继承自ComboBox,然后重写GotFocus,这个好处是可以随意使用,不会定死了。

但是,需要设置DataGrid的SelectionMode="Single",要不然,点选了了几个,就选中了几个

 

解决IsEditable="True"的ComboBox在DataGrid中点击一次不能选中行的问题的更多相关文章

  1. Silverlight 查询DataGrid 中匹配项 ,后台改变选中行颜色

    需求:根据关键字(参会人号码或名称)查找参会人,在datagird 中高亮显示 界面:我在界面上增加了一个文本框和按钮,进行查找操作 操作说明: 根据关键字进行搜索:输入关键字 点击查找,如果找到 以 ...

  2. JQuery EasyUI DataGrid获取当前行或选中行

    1.获取当前选中行,如果没有选中行,则返回 null var row = $('#gridID').datagrid('getSelected'); 2.获取当前所有选中行数据,返回元素记录的数组数据 ...

  3. easyUI中点击datagrid列标题排序

    easyUI中点击datagrid的排序有两种,一种是本地的,一种是服务器的.本地的只能排序当前页,而服务器的可以对全部页进行排序.这里主要是分享下服务器排序. 1.为datagrid添加属性remo ...

  4. 解决QML开发中ComboBox中一个已选择项没有清除的问题

    解决QML开发中ComboBox中一个已选择项没有清除的问题 近期使用QML开发一个项目.须要使用ComboBox进行显示.当进行一个操作时,须要向ComboBox加入一个元素,当进行另外一个操作时. ...

  5. Eclipse 在ubuntu桌面显示快捷启动以及解决Eclipse 在ubuntu中点击菜单栏不起作用的原因.

    要在Eclipse中设置好之后,可以通过如下方式在周末显示快捷启动以及解决Eclipse在ubuntu高版本中点击菜单栏项不显示列表的问题 在usr/share/app-install/desktop ...

  6. easyui datagrid行中点击a标签链接,行被选中,但是获取不到对应的参数

    easyui中使用比较多的就是datagrid了,表格中添加连接,点击跳转,为比较常用的方式;往往在点及标签后调用getSeleted方法会失效; 一.初始代码: {field: 'id',title ...

  7. 解决默写浏览器中点击input输入框时,placeholder的值不消失的方法

    html中,placeholder作为input的一个属性,起到了在输入框中占位并提示的作用. 但是有一些浏览器,如chrome,当鼠标点击输入框时,placeholder的值不消失,只有输入数据才消 ...

  8. MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应解决方法

    问题: MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应 解决方法: 如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了.这个 ...

  9. Switch开关在element-ui表格中点击没有效果解决方法

    <el-table-column label="三审" align="center"> <template slot-scope=" ...

随机推荐

  1. ThreadLocal 类 的源码解析以及使用原理

    1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体, ...

  2. C# 实现FTP客户端

    本文是利用C# 实现FTP客户端的小例子,主要实现上传,下载,删除等功能,以供学习分享使用. 思路: 通过读取FTP站点的目录信息,列出对应的文件及文件夹. 双击目录,则显示子目录,如果是文件,则点击 ...

  3. C#字典Dictionay多线程读是否是安全的

    答案:是线程安全的,只读不写多线程下,完全不需要加锁! 测试代码: using System; using System.Diagnostics; using System.Threading; us ...

  4. 使用Nginx实现服务器反向代理和负载均衡

    前言 同事总问我Nginx做反向代理负载均衡的问题,因此特意留下一篇扫盲贴! 直接部署服务器的风险 假设,我开发了一个网站,然后买了一台Web服务器和一台数据库服务器,直接部署到公共网络上.如下图,网 ...

  5. ctypes库调用dll的个人见解

    最近着手开发一个小东西涉及到了API接口的知识点, 第一次使用到了ctypes库,在网上找了一大圈,基本都是讲add.dll之后就没了. 就像下面这个: from ctypes import * dl ...

  6. [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt

    [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt --//昨天看了https://jonathanlewis.wordpress.com/2017/06/0 ...

  7. SqlServer执行Insert命令同时判断目标表中是否存在目标数据

    针对于已查询出数据结果, 且在程序中执行Sql命令, 而非数据库中的存储过程 INSERT INTO TableName (Column1, Column2, Column3, Column4, Co ...

  8. sql生成连续日期(年份、月份、日期)

    此随笔主在分享日常可能用到的sql函数,用于生成连续日期(年份.月份.日期) 具体的看代码及效果吧! -- ============================================= ...

  9. Pyqt5+python+ErIC6+QT designer

    Eric6安装及配置 https://blog.csdn.net/weixin_41656968/article/details/80253012 Python3.6+PyQt5+Eric6.0环境配 ...

  10. AndroidNDK开发中使用CMake编译JNI

    虽然一直在做NDK的开发工作,但是由于项目比较久远,都是使用Makefile进行底层编译,对于目前AndroidStudio官方提供的CMake编译方式并不是很了解,现在学习下这种已经不算新潮的新方式 ...