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

时间:2013-05-04 17:38:09

标签: c# devexpress devexpress-windows-ui

我的表单上有来自DevExpress的2个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;
    }

正如您所看到的,代码与之相同,除了在将文本添加到集合之前将文本转换为double。

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

非常感谢任何帮助!

顺便说一句,我可以添加一个链接到一个复制问题的示例项目,但是你需要安装DevExpress v12.2.6控件来编译项目。

1 个答案:

答案 0 :(得分:2)

我也将它发布到DevExpress团队,他们非常慷慨地提供解决方案:

  

我同意这种差异似乎令人困惑。出现差异的原因是LookUpEdit.ProcessNewValueCore调用RepositoryItemLookUpEdit.GetKeyValueByDisplayValue,它从LookUpListDataAdapter返回一个空值,因为从double到string不存在隐式转换。您可以通过对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;
}

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