DevExpress LookUpEdit行为

时间:2010-02-05 18:51:11

标签: data-binding c#-3.0 devexpress winforms

我正在为这个惊人的问题撕掉我的头发。

我从代码中绑定了2个LookUpEdit:

            MyBinding.DataSource = typeof(MyObject);
        MyBinding.DataSource = _dataObject.GetMyList();

        firstLookUp.DataBindings.Add("EditValue", MyBinding, "Code");
        firstLookUp.Properties.DataSource = MyBinding;
        firstLookUp.Properties.ValueMember = "Code";
        firstLookUp.Properties.DisplayMember = "Code";

        secondLookUp.DataBindings.Add("EditValue", MyBinding, "Info");
        secondLookUp.Properties.DataSource = MyBinding;
        secondLookUp.Properties.ValueMember = "Info";
        secondLookUp.Properties.DisplayMember = "Info";

第一个问题是:更改两个LookUps中的一个不反映更改另一个的值!但即时使用相同的BindingSource,位置是否相同?

另一个是:他们都自动填充列,我不想显示所有列,尝试删除,找不到异常列,如果我添加,我得到重复列! 我不明白!!!

2 个答案:

答案 0 :(得分:1)

更改LookupEdit的EditValue不直接绑定到BindingSource.Current位置。

你必须使用像

这样的东西
lookUpEdit1.Properties.GetDataSourceRowByKeyValue(lookUpEdit1.EditValue)

如果你想连接两个LookupEdits,你可能最好在另一个被改变时设置一个的编辑值。

其次你应该能够像这样清除列的列表:

lookUpEdit1.Properties.Columns.Clear();
lookUpEdit1.Properties.Columns.Add(new LookUpColumnInfo("FirstName"));

答案 1 :(得分:1)

如上所述

http://www.devexpress.com/Support/Center/p/B138420.aspx

http://www.devexpress.com/Support/Center/p/A2275.aspx

LookupEdit确实更新了BindingSource的Current属性。

我们使用以下代码作为解决方法:

/// <summary>
/// Wrapper around DevExpress.XtraEditors.LookUpEdit to fix bug with adjusting the BindingSources Current Position
/// </summary>
public sealed class LookUpEditWithDataSource : LookUpEdit
{
    private bool firstCall = true;

    /// <summary>
    /// Called when the edit value changes.
    /// </summary>
    protected override void OnEditValueChanged()
    {
        base.OnEditValueChanged();

        if (this.Properties.DataSource == null)
        {
            return;
        }

        if (this.BindingContext == null)
        {
            return;
        }

        if (this.firstCall)
        {
            this.firstCall = false;

            // HACK
            // starting and selecting the first item
            // doesn't work so we change the position to the first item
            this.BindingContext[this.Properties.DataSource].Position = 1;
        }

        this.BindingContext[this.Properties.DataSource].Position = this.Properties.GetDataSourceRowIndex(this.Properties.ValueMember, this.EditValue);
    }
}