LookUpEdit详解

一、属性的基本介绍:

绑定数据源:                     
            lookUpEdit.Properties.ValueMember = 实际要用的字段;   //相当于Editvalue
            lookUpEdit.Properties.DisplayMember =要显示的字段;    //相当于Text
            lookUpEdit.Properties.DataSource = 数据源;

注:这种绑定后的效果为数据源有几列,在下拉列表中就会显示几列;如果只想显示某列则进行如下设置:

     lookUpEdit.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("要显示的列名称"));

常用属性:

          Popupwidth 下拉框宽度 ,   示例:lookUpEdit.Properties.PopupWidth = 500; //设置下拉框的宽度;
          Nulltxt    空时的值  ,示例:this.lookUpEdit1.Properties.NullText = "请选择";
          DropDownRows 下拉框行数 ,示例:lookUpEdit1.Properties.DropDownRows = 2; //下拉框显示的记录条数

 判断是否选择下拉框:
             if(this.lookUpEdit.Editvalue==null ||this.lookUpEdit.Editvalue.tostring()=="nulltext")
             {
                //提示信息,说明未选择下拉框
             }   
  清空nullText值: 
            lookUpEdit.Properties.nulltext=null;

  设置nullText值:
    lookUpEdit.Properties.nulltext=“请您选择”;
   使用lookUpEdit1的值:
          变量=this.lookUpEdit.Editvalue.Tostring()  //是LookUpEdit.Properties.ValueMember的值
          变量=this.lookUpEdit.Text.Trim()      //是LookUpEdit.Properties.DisplayMember 的值  

 是否显示列名  
          this.txtBillName.Properties.ShowHeader = false;
  是否显示底部  
           this.txtBillName.Properties.ShowFooter = false; 

        特别值得注意的是,有时候我们要使用lookUpEdit来实现combox的一些效果,在实际的使用过程中在程序加载的时候会默认的选择第一项,它的设置是:

       lookUpEdit.Itemindex=0;   //选择第一项

       lookUpEdit.Itemindex=-1; //无选项,此时显示的是nullText值 其实这个地方只要Editvalue==null,lookUpEdit就显示nullText

       lookUpEdit1.Editvalue=value;//自动搜索datasouse,选择与之匹配的值,没有的情况下赋值null ,value的值必须与Valuemember的数据类型一致。

介绍三个重要的属性:
1. LookUpEdit.Properties.ImmediatePopup 在输入框按任一可见字符键时立即弹出下拉窗体。
2. LookUpEdit.Properties.AutoSearchColumnIndex 设置自动搜索的栏位序号,下拉窗体第一个栏位为0,依此类推,此属性配合SearchMode=OnlyInPopup时有效。
3. LookUpEdit.Properties.SearchMode 自动搜索定位模式
贴图图片

关于枚举类型SearchMode的定义:

C# Code:
public enum SearchMode
{
   OnlyInPopup = 0,
   AutoComplete = 1,
   AutoFilter = 2,
}

OnlyInPopup : 配合ImmediatePopup=True时使用,当用户在输入框按任一可见字符键时立即弹出下拉窗体,并跟据输入的字符从头部开始匹配AutoSearchColumnIndex属性指定栏位字段的值,第一个栏位为0.

特点:在下拉窗体能显示匹配结果(蓝底白字),但在输入框内不显示。
效果图如下:
贴图图片


AutoComplete: 配合ImmediatePopup=True时使用,当用户在输入框按任一可见字符键时立即弹出下拉窗体,并在输入框自动完成您想要输入的数据,同时下拉 窗体自动匹配最佳记录。AutoComplete模式仅匹配DisplayMember对应字段的值。
特点:能在输入框显示匹配的数据,并且下拉窗体显示匹配的记录。
效果图如下:

贴图图片

AutoFilter: 配合ImmediatePopup=True时使用,当用户在输入框按任一可见字符键时立即弹出下拉窗体,并在输入框自动完成您想要输入的数据,同时下拉窗体自动过滤掉不匹配的记录。
特点:能在输入框显示匹配的数据,并过滤过不想要的记录。

贴图图片

二、具体的使用:

看过了上面属性的介绍,一般的使用已经够了,但有的情况下,允许用户自由输入,即输入的值不一定是在绑定的数据源中,光用上面的属性就不行了,因为就算你输入的内容不在数据库中,控件也会帮你选中数据源中第一条数据,清空你输入的数据,恼火。。可以用下面的方法解决:

The LookUp editor allows a user to enter values which cannot be found in the lookup list. A programmer should handle this situation, otherwise a new value is lost. The LookUp editor provides a ProcessNewValue event for this.

First of all, you should set the SearchMode property to OnlyInPopup and TextEditStyle to Standard to enable free text entry.

There are two common approaches for handling the ProcessNewValue event:
1. Immediately insert the new record in the lookup table and generate a new ID for it.
2. Display a dialog, where a user can set values for a new data row.

示例代码1

List<std_MetaInfo> source = DataHelper.MetaInfos;//数据源
EditorHelper.BindLookUpEdit(lueStdNO, source, "StdNO", "StdNO");
//lueStdNO.ProcessNewValue += lue_ProcessNewValue;
//实现自由输入功能
private void lue_ProcessNewValue(object sender, ProcessNewValueEventArgs e)
{
RepositoryItemLookUpEdit edit = ((LookUpEdit)sender).Properties;
if (e.DisplayValue == null || edit.NullText.Equals(e.DisplayValue) || string.Empty.Equals(e.DisplayValue))
return;//为空或者选择项不变,不执行后续操作
std_MetaInfo meta = new std_MetaInfo();
meta.StdNO = e.DisplayValue.ToString();
source.Add(meta);//在数据源中添加一条记录,如果数据源是DataTable,添加DataRow,其他形式数据源解决方法类似
e.Handled = true;
}
public class EditorHelper
{
public static void BindLookUpEdit(LookUpEdit lue, object source, string value, string displayName)
{
lue.Properties.DataSource = source;
lue.Properties.DisplayMember = displayName;
lue.Properties.ValueMember = value;
lue.Properties.NullText = "";
lue.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//要使用户可以输入,这里须设为Standard
lue.Properties.SearchMode = SearchMode.AutoFilter;//自动过滤掉不需要显示的数据,可以根据需要变化
}
}

示例代码2

   private void LookUpEdit1_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)

   {

      DataRow Row;

      RepositoryItemLookUpEdit Edit = ((LookUpEdit)sender).Properties;

      if (e.DisplayValue == null || Edit.NullText.Equals(e.DisplayValue) || string.Empty.Equals(e.DisplayValue))

      return;

      using (Form2 f = new Form2())

      {

         f.ItemID = "(Auto Number)";

         f.ItemName = e.DisplayValue.ToString();//ItemName是Form2中的一个属性,return Form2中一个文本框的值

         if (f.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)

         {

              e.DisplayValue = f.ItemName;

              Row = LookupTable.NewRow();

              Row["Name"] = f.ItemName;

              LookupTable.Rows.Add(Row);

         }

      }

     e.Handled = true;

  }

三、获取选中行其他列的值

     //选中参数行,数据源为DataTable, 参数行是DataRowView对象。
           object objParam = lpCNCParameter.Properties.GetDataSourceRowByKeyValue(lpCNCParameter.EditValue);
            if (objParam is DataRowView)
            {
                DataRowView rv = objParam as DataRowView;
                string strValue = rv.Row["列名"].ToString();//获取选择行指定列的值
            }

posted @ 2015-08-10 11:23  武道巅峰  阅读(2263)  评论(0编辑  收藏  举报