C# Devexpress,RepositoryItemComboBox,具有多个列,如RepositoryItemGridLookUpEdit

C# Devexpress,RepositoryItemComboBox,具有多个列,如RepositoryItemGridLookUpEdit,c#,devexpress,C#,Devexpress,我想在单击列中的单元格后显示具有多个列的网格(如在RepositoryItemGridLookUpEdit),但如果用户不想从网格中拾取项,则可以编写其他内容(如在RepositoryItemComboBox)。如何结合这两个功能 //user can write, but only one column RepositoryItemComboBox cbeMaterialy = new RepositoryItemComboBox(); DataTable dt = Getdt(); cbeM

我想在单击列中的单元格后显示具有多个列的网格(如在
RepositoryItemGridLookUpEdit
),但如果用户不想从网格中拾取项,则可以编写其他内容(如在
RepositoryItemComboBox
)。如何结合这两个功能

//user can write, but only one column
RepositoryItemComboBox cbeMaterialy = new RepositoryItemComboBox();
DataTable dt = Getdt();
cbeMaterialy.Items.Clear();

foreach(DataRow item in dt.Rows)
{
    cbeMaterialy.Items.Add(item);
}

gvView.Columns["ColumnName"].ColumnEdit = cbeMaterialy;



//user cannot write but multiple columns
RepositoryItemGridLookUpEdit editor = new RepositoryItemGridLookUpEdit();
editor.DataSource = dt;
column.ColumnEdit = editor;
//解决方案! 我混合了Devexpress团队的一些答案,得出了以下结论:

public class Main()
    {
        //user can choose element from DB or write new value
        RepositoryItemGridLookUpEdit riglue = new RepositoryItemGridLookUpEdit();
        MyGridLookupDataSourceHelper.SetupGridLookUpEdit(riglue, GetMaterialyDataView(), "Kod", "Kod");
        elementsEditGrid.gvView.Columns[ColumnName].ColumnEdit = riglue;
    }


///////////////////

public class MyGridLookupDataSourceHelper
{
    RepositoryItemGridLookUpEdit edit;

    public MyGridLookupDataSourceHelper(RepositoryItemGridLookUpEdit edit, ITypedList dataSource, string displayMember, string valueMember)
    {
        this.edit = edit;

        //enable writing into RepositoryItemGridLookUpEdit
        edit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;

        edit.DataSource = dataSource;
        edit.DisplayMember = displayMember;
        edit.ValueMember = valueMember;
        edit.ProcessNewValue += edit_ProcessNewValue;

        AddExistingValuesToDataSource();
    }

    public static void SetupGridLookUpEdit(RepositoryItemGridLookUpEdit edit, ITypedList dataSource, string displayMember, string valueMember) 
    {
        new MyGridLookupDataSourceHelper(edit, dataSource, displayMember, valueMember);
    }

    //Add new values to temporary data source (not to DataBase!)
    void edit_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
    {
        GridLookUpEdit lookUp = sender as GridLookUpEdit;
        RepositoryItemGridLookUpEdit ri = lookUp.Properties;
        DataTable dt = (ri.DataSource as DataView).Table;
        DataRow row = dt.NewRow();
        row[ri.DisplayMember] = e.DisplayValue;
        row[ri.ValueMember] = e.DisplayValue;
        dt.Rows.Add(row);
        ri.View.RefreshData();
        e.Handled = true;

        //if user wants to add new values to database (data source)
        //INSERT INTO DataSourceTable (ColumnName) VALUES (e.DisplayValue)
    }

    //Adds to temporary data source values already stored in RepositoryItemGridLookUpEdit (in case values aren't from DB)
    void ProcessExistingValues(RepositoryItemGridLookUpEdit sender, object value)
    {
        RepositoryItemGridLookUpEdit ri = sender;
        DataTable dt = (ri.DataSource as DataView).Table;
        DataRow row = dt.NewRow();
        row[ri.DisplayMember] = value;
        row[ri.ValueMember] = value;
        dt.Rows.Add(row);
        ri.View.RefreshData();
    }

    private void AddExistingValuesToDataSource()
    {
        //SELECT from DB values that are already in riglue and add them to TEMPORARY DATA SOURCE (in case values aren't from DB)
        //DataView dataView = SELECT ColumnName FROM table WHERE rowID = XXX

        foreach (DataRow row in dataView.AsEnumerable())
        {
            string kod = (string)row["ColumnName"];

            ProcessExistingValues(this.edit, kod);
        }
    }
}

您可以将属性设置为标准,并可以键入。当用户键入与查找数据源中包含的内容不同的内容时,将引发该事件。在事件处理程序中,您可以向数据源添加一个新值以进一步使用它。

RepositoryItemComboBox没有允许将表与多列绑定的
数据源属性


ComboBoxEdit
具有
datasource
属性,因此您可以使用多列创建表,或创建多列。

如果我不想向数据源添加新值,该怎么办?这可能吗?这是一个数据感知控件,它与数据源一起工作。因此,记录应该在数据源中。但是,你可以按照这个例子来完成你的任务。这里为真实数据源创建了一个包装器。谢谢,我会检查一下。但是制作“多列RepositoryItemComboBox”怎么样?这不可能吗?ComboBox只支持一列