说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在winform中,请教关于combobox的一个小问题

编辑:说三道四文库 发布时间:2018-02-25 02:13
HTML文档下载 WORD文档下载 PDF文档下载
请问,当combobox无法找到数据源时,如何给他的item进行添加,添加时需要添加相应的text和value.
另外,datagrid的selectindexchange的事件在winform中是怎么样的?
分不够可以再加
绑定:
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=kyserver;database=hos;uid=sa;password=");
conn.Open();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("select * from Hr_dept",conn);
dt = new System.Data.DataSet();
da.Fill(dt,"CMMNUMST");

 dv = new DataView(dt.Tables[0]);
this.dataGrid1.DataSource = dv;
this.comboBox1.DataSource = dv;
this.comboBox1.DisplayMember = "stuno";
手工添加
foreach(DataRow dr in dt.Tables[0].Rows)
{
this.comboBox1.Items.Add(dr[0].ToString();
}
我不建议将combobox和数据源绑定,通常都是取得一个两个字段的记录集,再添到combobox,当然取记录集和添到控件的操作都写到公共类的方法里;
datagrid的selectindexchange的事件在winform中是怎么样的?我不知道你是想知道些什么,只能告诉你,很好用
我在winform中的datagrid,找不到这个selectindexchanged事件,是不是她使用别的名字?

另外,关于combobox,我不能进行绑订,因为我没有数据源,当然,应该是可以手工建立数据源的,我现在从文件中读出满足条件的内容,希望内容A能作为combobox项的text,内容B却作为combobox的valu。
有两种方式可以填充 ComboBox 和 ListBox 控件。

例如,通过使用 Items 方法可以向 ComboBox 添加对象。也可以通过用 DataSource、DisplayMember 和 ValueMember 属性填充 ComboBox 来向 ComboBox 添加对象。

当combobox无法找到数据源时,这是什么意思?

datagrid的selectindexchange的事件在winform中,好像没有这个东西?
// Populates the list box using DataSource. 
         // DisplayMember is used to display just the long name of each state.
         ArrayList USStates = new ArrayList()   ;
         USStates.Add(new USState("Alabama", "AL"));
         USStates.Add(new USState("Washington", "WA"))  ; 
         USStates.Add(new USState("West Virginia", "WV"));
         USStates.Add(new USState("Wisconsin", "WI")) ;
         USStates.Add(new USState("Wyoming", "WY"));

         ListBox1.SelectedValueChanged += new EventHandler(ListBox1_SelectedValueChanged);
         ListBox1.DataSource = USStates ;
         ListBox1.DisplayMember = "LongName"     ;
         ListBox1.ValueMember = "ShortName" ;
[C++, JScript] 没有可用于 C++ 或 JScript 的示例。若要查看 Visual Basic 或 C# 示例,请单击页左上角的语言筛选器按钮 。



这是在帮助中的一部分示例代码,或许对你有帮助
为大家提供一套我写的公共类的方法,可以方便的将记录集添加到控件ComboBox,ListBox 中

/// --------------------------------------------------
///             FillItemsByDataset()
/// --------------------------------------------------            
/// 方法功能:
/// 将数据集合中的数据添加到ComboBox ListBox
/// 入口参数:
///         sender: 控件对象(ComboBox,ListBox)
///         ds:DataSet数据集(前两个字段分别为对象的DisplayMember,ValueMember对应值)
/// 出口参数:
/// 无
/// 全局变量:
/// 无
/// WEB 注释:
///         <summary>将数据集合中的数据添加到ComboBox ListBox</summary>
///         <param name="sender">控件对象(ComboBox,ListBox).</param>
///         <param name="ds">DataSet数据集(前两个字段分别为对象的DisplayMember,ValueMember对应值)</param>
///         <returns>正常装入目标控件返回 true,出错返回 false</returns>
///         <remarks></remarks>
/// --------------------------------------------------
public bool FillItemsByDataset(object sender,DataSet ds)
{
if (ds==null||ds.Tables.Count==0)
{
return false;
}
try
{
switch(sender.GetType().ToString())       
{         
case "System.Windows.Forms.ComboBox":  
System.Windows.Forms.ComboBox cb = (System.Windows.Forms.ComboBox) sender;
cb.Items.Clear();
cb.DataSource=ds.Tables[0].DefaultView;
cb.DisplayMember=ds.Tables[0].Columns[0].ToString();
cb.ValueMember=ds.Tables[0].Columns[1].ToString();
break; 
case "System.Windows.Forms.ListBox":  
System.Windows.Forms.ListBox lb = (System.Windows.Forms.ListBox) sender;
lb.Items.Clear();
lb.DataSource=ds.Tables[0].DefaultView;
lb.DisplayMember=ds.Tables[0].Columns[0].ToString();
lb.ValueMember=ds.Tables[0].Columns[1].ToString();
break; 
default:            
break;  
}
}
catch(System.Exception Err)
{
mstcErrorInfo.Description=Err.Message;
return false;
}
ds.Dispose();
return true;
}
问题是这样的,我有这么一个xml文件
<HotelDescript>
     <HotelNB>
        <AuthNB>YES</AuthNB>
        <HotelNameNB>name3</HotelNameNB>
        <HotelCodeNB>code3</HotelCodeNB>
     </HotelNB>
     <HotelNH>
        <AuthNH>NO</AuthNH>
        <HotelNameNH>name2</HotelNameNH>
        <HotelCodeNH>code2</HotelCodeNH>
     </HotelNH>
     <HotelTZ>
        <AuthTZ>YES</AuthTZ>
        <HotelNameTZ>name1</HotelNameTZ>
        <HotelCodeTZ>code1</HotelCodeTZ>
     </HotelTZ>
  </HotelDescript>
然后,我在代码中根据一系列条件取读取这个xml(当然这个xml文件中只有上面显示的部分是我所需要的,其他未显示的还有很多),并把读出来的放到combobox中,code作为value,name作为text。
private struct selNameValue
{
public string sName;
public string sValue;
public selNameValue(string sParaName, string sParaValue)
{
this.sName  = sParaName;
this.sValue = sParaValue;
}
public string Name
{
get
{
return this.sName;
}
}
public string Value
{      
get
{
return this.sValue;
}
}
public override string ToString()
{
return this.Name + " - " + this.Value;
}
}

//构造函数中
// Populates the list box using DataSource. 
// DisplayMember is used to display just the long name of each state.
ArrayList ArrSrc = new ArrayList();
ArrSrc.Add(new selNameValue("Text1", "1"));//此处传值name,code
ArrSrc.Add(new selNameValue("Text2", "2")) ; 
ArrSrc.Add(new selNameValue("Text3", "3"));
this.comboBox1.DataSource = ArrSrc;
this.comboBox1.DisplayMember = "Name";//selNameValue结构中的属性
this.comboBox1.ValueMember = "Value"; //selNameValue结构中的属性

private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (this.comboBox1.SelectedIndex != -1)
MessageBox.Show(this.comboBox1.SelectedValue.ToString());
}
为什么我的combobox和datagrid就是绑不上去呢?
private void BindGrid()
{
  string code = this.CBBcode;
  DataSet ds = this.DsAll;
  DataView dv = ds.Tables[0].DefaultView;
  dv.RowFilter="HotelCode='"+code+"'"; 
  this.dgRoomType.DataSource = dv;
  if (dv.Count > 0)
  {
     this.dgRoomType.Select(0);
     string type = this.dgRoomType[0,0].ToString();
     this.DtRow = ds.Tables[0].Select("HotelCode='"+code+"' and Type='"+type+"'")[0];
     this.ShowType();
  }
  else
  {
     this.btnDelete.Enabled = false;
     this.ClearShow();
   }
}

这里是combobox部分:
private void BindCombobox()
{
DataSet dsXml = new DataSet();
dsXml.ReadXml(@"hotel.xml");
this.cbbHotel.DataSource = dsXml.Tables[0];
this.cbbHotel.DisplayMember = dsXml.Tables[0].Columns[1].ColumnName;
this.cbbHotel.ValueMember = dsXml.Tables[0].Columns[0].ColumnName;
}
up
combobox部分帮定不上去是因为DataSet的内部实现引起的
DataSource 与DisplayMember、ValueMember属性设置存在紧密关系。
你可以照搬我用的selNameValue结构
然后
private void BindCombobox()
{
DataSet dsXml = new DataSet();
dsXml.ReadXml(@"hotel.xml");
ArrayList ArrSrc = new ArrayList();
for (int i=0;i<dsXml.Tables[0].Rows.Count;i++)
{
ArrSrc.Add(new selNameValue(dsXml.Tables[0].Rows[i,1].ToString(), dsXml.Tables[0].Rows[i,0].ToString()));//此处传值name,code
}
this.cbbHotel.DataSource = ArrSrc;
this.cbbHotel.DisplayMember = "Name";//selNameValue结构中的属性
this.cbbHotel.ValueMember = = "Value"; //selNameValue结构中的属性
}
我完全使用你的方法,为什么在运行到这一句
this.cbbHotel.ValueMember = = "Value"; //selNameValue结构中的属性

报错“未将对想引用蛇值到对象实力”
但是我新建一个windowsapplication,用你的方法就是好的,真奇怪。
dataGrid1.SetDataBinding(dataset.Tables[0],"");
to lansluo:
未将对象引用设置到对象实例。
I'm sorry!
this.cbbHotel.ValueMember = = "Value"; //selNameValue结构中的属性
-->
this.cbbHotel.ValueMember = "Value"; //selNameValue结构中的属性
New_bug(Chen)另开贴感谢。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘