我本无名
菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。
在使用Microsoft.Net Framework环境下编写数据库方面的软件时,经常要用到DataGrid数据显示控件,但同时也发现,DataGrid提供的网格显示中,只有两 种:一种是普通的Text控件,另一种则是CheckBox控件,显示形式极少。但我们经常需要实现下拉列表控件的显示形式。
由 于DataGrid中列的显示样式是由DataGridTextBoxColumn和DataGridBoolColumn类控制的;前者为显示样式为 Text控件样式,后者则为CheckBox控件样式。由于我们需要在DataGrid的网格中显示ComboBox下列拉表样式,因为我们写了一个新 类,继承于DataGridTextBoxColumn类。以下是类的定义代码:
 
    ///<summary>
    /// ·本类实现DataGrid中实现ComboBox样式,并取得选取的字符串的值
    ///</summary>
    public class DataGridComboColumnString:DataGridTextBoxColumn
    {
       private ComboBox comboBox;
       private CurrencyManager _source; //当前管理的数据源
       private int rowNum; //记录显示控件的行
       public ComboBox Cb
       {
           get
           {
              return comboBox;
           }
       }
 
       public DataGridComboColumnString()
       {
           comboBox=new ComboBox();
           this.comboBox.Leave+=new EventHandler(comboBox_leave);
           this.comboBox.SelectedValueChanged+=new EventHandler(Select_click);
       }
       //comboBox 焦点丢失时,控件自动隐藏
       private void comboBox_leave(object sender,EventArgs e)
       {
           comboBox.Visible=false;
       }
       //当选取下拉列表中的字符串时,将获取的字符串值返回到DataGrid中去
       private void Select_click(object sender,EventArgs e)
       {          this.SetColumnValueAtRow(_source,rowNum,comboBox.SelectedItem.ToString());//设置当前列中选中行的字符串值
           comboBox.Visible=false;    
       }
       //重写Edit方法,以将Text控件的显示样式改为comboBox显示样式
       protected override void Edit(CurrencyManager dataSource,int rowNum,Rectangle bounds,bool readOnly,string instanttext,bool cellVisible)
       {   base.Edit(dataSource,rowNum,bounds,readOnly,instanttext,cellVisible);
           comboBox.Parent=this.TextBox.Parent;
           comboBox.Left=this.TextBox.Left-2;
           comboBox.Top=this.TextBox.Top-2;
           comboBox.Size=new Size(this.TextBox.Width,this.comboBox.Height);
           this.TextBox.Visible=false;
           comboBox.Visible=true;
           comboBox.BringToFront();
           comboBox.Focus();
           _source=dataSource;
           this.rowNum=rowNum;
       }
    }
上面的类中,实现了ComboBox的显示样式,并将选择的字符串值返回给了当前管理的数据源。但有时,我们需要的不是选中的字符串值,而是选中的索引值时,只需要将Select_click方法,稍加改写即可,将其中的代码改为:
           this.SetColumnValueAtRow(_source,rowNum,comboBox.SelectedIndex.ToString());
comboBox.Visible=false;
即可。
下面的代码是使用此类的方法:
       DataGridComboColumnString qxdh=new DataGridComboColumnString();
       qxdh.MappingName="qxdh";
       qxdh.Width=120;
       qxdh.HeaderText="登陆人员操作单位";
       qxdh.Cb.Items.Add("41");
    qxdh.Cb.Items.Add("42");
       qxdh.Cb.Items.Add("52");
    qxdh.Cb.Items.Add("62");
当然我们也可以通过Select_click方法进行扩展,达到很多目的,比如说数据验证,或者通过获取的值进行数据库查询,以将查询所得的值返回给当前管理的数据源,也未尝不可;同样可以重载Edit函数,以实现你需要的显示样式。
posted on 2007-11-24 16:10  我本无名  阅读(452)  评论(0编辑  收藏  举报