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

本文关键字:双精度 选择 新输入 输入 LookUpEdit | 更新日期: 2023-09-27 18:12:03

我有2个lookkupedit控件从DevExpress对我的表单。两者都使用ObservableCollection作为数据源,一个类型为string,另一个类型为double。LookUpEdit控件有一个名为ProcessNewValue的事件,当控件中输入一个新值时,该事件会触发。我在这个事件中添加了一些代码,将新添加的值添加到ObservableCollection中,并在完成后自动选择它。这工作如预期的string loopedit,但当我尝试它与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属性被设置为它,但是一旦事件终止,控件将其清除.....真的奇怪。

任何帮助都非常感谢!

BTW,我可以添加一个链接到一个重复问题的示例项目,但你需要有DevExpress v12.2.6控件安装,以便编译项目。

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

我也把这个发给了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;
}

控件现在按预期行为。我希望这能帮助到其他人