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只支持一列