当它是双精度时,LookUpEdit 不选择新输入的值

Posted

技术标签:

【中文标题】当它是双精度时,LookUpEdit 不选择新输入的值【英文标题】:LookUpEdit not selecting newly entered value when it's a double 【发布时间】:2013-05-04 17:38:08 【问题描述】:

我的表单上有 2 个来自 DevExpress 的 LookUpEdit 控件。两者都使用ObservableCollection 作为数据源,一个是string 类型,另一个是double 类型。 LookUpEdit 控件有一个名为ProcessNewValue 的事件,当您猜对了,在控件中输入了一个新值时会触发该事件。我在此事件中添加了一些代码,以将新添加的值添加到 ObservableCollection 并在完成后自动选择它。这对于 string LooUpEdit 可以正常工作,但是当我尝试使用 double LookUpEdit` 时,它会将其添加到集合中,但随后会清除控件。

这是加载控件的代码,在 Form_Load() 中调用:

    void InitControls()
    
        double[] issueNumbers = new double[5];

        issueNumbers[0] = 155;
        issueNumbers[1] = 156;
        issueNumbers[2] = 157;
        issueNumbers[3] = 158;
        issueNumbers[4] = 159;

        ObservableCollection<double> issues = new ObservableCollection<double>(issueNumbers);

        lookupIssues.Properties.DataSource = issues;
        DevExpress.XtraEditors.Controls.LookUpColumnInfoCollection colInfo = lookupIssues.Properties.Columns;
        colInfo.Clear();
        colInfo.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Column"));
        colInfo[0].Caption = "Issue ID's";

        string[] stringNumbers = Array.ConvertAll<double, string>(issueNumbers, Convert.ToString);
        ObservableCollection<string> issuesString = new ObservableCollection<string>(stringNumbers);

        lookupStringValue.Properties.DataSource = issuesString;
        colInfo.Clear();
        colInfo.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Column"));
        colInfo[0].Caption = "String Issue ID's";

    

这是两者的 ProcessNewValue 事件(我已将它们重命名以尝试更容易看到哪个在做什么):

    private void OnProcessNewValue_Double(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
    
        ObservableCollection<double> source = (ObservableCollection<double>)(sender as LookUpEdit).Properties.DataSource;

        if (source != null)
        
            if ((sender as LookUpEdit).Text.Length > 0)
            
                source.Add(Convert.ToDouble((sender as LookUpEdit).Text));
                (sender as LookUpEdit).Refresh();
            
        

        e.Handled = true;
    

    private void OnProcessNewValue_String(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
    
        ObservableCollection<string> source = (ObservableCollection<string>)(sender as LookUpEdit).Properties.DataSource;

        if (source != null)
        
            if ((sender as LookUpEdit).Text.Length > 0)
            
                source.Add((sender as LookUpEdit).Text);
                (sender as LookUpEdit).Refresh();
            
        

        e.Handled = true;
    

如您所见,除了在将文本添加到集合之前将文本转换为双精度外,其他代码相同。

任何人都知道为什么双精度值被添加到集合中,但控件不像字符串集合那样自动选择它?我什至尝试在e.Handled = true; 之后对新添加的值进行硬编码,但它仍然没有选择它。奇怪的是,如果我通过调试器运行它,我可以单步执行并看到 lookupIssues 控件确实获得了新添加的值,并且它的 Text 属性设置为它,但是一旦事件终止,控制清除它......真的很奇怪。

非常感谢任何帮助!

顺便说一句,我可以添加一个指向重复问题的示例项目的链接,但您需要安装 DevExpress v12.2.6 控件才能编译该项目。

【问题讨论】:

【参考方案1】:

我也将此发布给 DevExpress 团队,他们非常热情地提供了解决方案:

我同意这种差异看起来令人困惑。差异的原因是 LookUpEdit.ProcessNewValueCore 调用了 RepositoryItemLookUpEdit.GetKeyValueByDisplayValue,它从 LookUpListDataAdapter 返回了一个空值,因为不存在从双精度到字符串的隐式转换。您可以通过对 ProcessNewValue 处理程序进行以下更改来解决差异:

private void OnProcessNewValue_Double(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e) 

    ObservableCollection<double> source = (ObservableCollection<double>)(sender as LookUpEdit).Properties.DataSource;

    if (source != null) 
        if ((sender as LookUpEdit).Text.Length > 0) 
            double val = Convert.ToDouble((sender as LookUpEdit).Text);
            source.Add(val);
            e.DisplayValue = val;
            (sender as LookUpEdit).Refresh();
        
            
    e.Handled = true;

控件现在按预期运行。我希望这可以帮助其他人:)

【讨论】:

以上是关于当它是双精度时,LookUpEdit 不选择新输入的值的主要内容,如果未能解决你的问题,请参考以下文章

C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?

dev的lookupedit怎么清空选择

qgis双精度怎么弄

DevExpress LookupEdit 控件,如何设置不弹出下拉框。现在的做法是弹出后马上关闭,但总会闪一下出来。。

C#里面的第三方Devexpress插件 lookupedit 键入值的问题

dev的lookupedit怎么清空选择