很疑惑,百度了下,越看越不懂,有的人说用Combobox直接添加进DataGridView中,我不需要这么高端,我只需要自带的控件添加进去,可是我没搞定,希望大侠给点指点
首先
1.拖控件DataGridView、GroupBox等等等,此处省略500字
2.根据数据库的字段来编辑字段,因为我知道里面会包含很多控件,单单的Select语句出来的数据源已经无法阻止我。3.界面搭建好了,去后台代码连接数据库取数据源 private void Bind2(int Areacode2)
{
SqlConnection scConnection = new SqlConnection(connstr); //建立Connection
SqlCommand scCommand2 = scConnection.CreateCommand(); //建立Command
scCommand2.CommandText = "select Id,Shipdate,Shipcompany,Company,Portship,Shipday,[20],[40],HQ,Dodate,Endday,Tax,Addcharge,Mark,Areacode1,Areacode2 from zheng where Areacode1=@Areacode1 and Areacode2=@Areacode2";
scCommand2.Parameters.AddWithValue("@Areacode1", area);
scCommand2.Parameters.AddWithValue("@Areacode2", Areacode2);
sdaAdapter2 = new SqlDataAdapter(scCommand2); //建立Adapter
scbBuilder2 = new SqlCommandBuilder(sdaAdapter2); //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
dsSet.Clear(); //使用容器前先清空容器
sdaAdapter2.Fill(dsSet, "zheng"); //填充数据
bind2 = this.BindingContext[dsSet.Tables["zheng"]];
dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定
}自己写了个方法取出DataTable数据源并且绑定到DataGridView 到这里全部正确。然后问题来了,我绑定DataGridViewTextBoxColumn 的字段都字段名和 DataSouce名字一致,
但是DataGridViewComboBoxColumn 我在图形视图没有设置,导致DataGridView里多出字段来
我需要的是数据库 SELECT出来的字段正好是我DataGridView里的字段,而DataGridViewTextBoxColumn这列显示的也正好是我数据库里的查出来的值,当我鼠标点击下拉框的时候,DataGridViewTextBoxColumn 该列再出现一个数据源,是下拉数据源,比如说
{{value:男,index:0},{value:女,index:1},{value:未知,index:3}}
怎么做,也就是有两数据源的概念
这个是数据库查出来的,那么这个 Shipdate这列就应该是第一行是男,第二行是女,当我点击这列时候再出现 “男 女 未知”这个数据源给我选
首先
1.拖控件DataGridView、GroupBox等等等,此处省略500字
2.根据数据库的字段来编辑字段,因为我知道里面会包含很多控件,单单的Select语句出来的数据源已经无法阻止我。3.界面搭建好了,去后台代码连接数据库取数据源 private void Bind2(int Areacode2)
{
SqlConnection scConnection = new SqlConnection(connstr); //建立Connection
SqlCommand scCommand2 = scConnection.CreateCommand(); //建立Command
scCommand2.CommandText = "select Id,Shipdate,Shipcompany,Company,Portship,Shipday,[20],[40],HQ,Dodate,Endday,Tax,Addcharge,Mark,Areacode1,Areacode2 from zheng where Areacode1=@Areacode1 and Areacode2=@Areacode2";
scCommand2.Parameters.AddWithValue("@Areacode1", area);
scCommand2.Parameters.AddWithValue("@Areacode2", Areacode2);
sdaAdapter2 = new SqlDataAdapter(scCommand2); //建立Adapter
scbBuilder2 = new SqlCommandBuilder(sdaAdapter2); //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
dsSet.Clear(); //使用容器前先清空容器
sdaAdapter2.Fill(dsSet, "zheng"); //填充数据
bind2 = this.BindingContext[dsSet.Tables["zheng"]];
dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定
}自己写了个方法取出DataTable数据源并且绑定到DataGridView 到这里全部正确。然后问题来了,我绑定DataGridViewTextBoxColumn 的字段都字段名和 DataSouce名字一致,
但是DataGridViewComboBoxColumn 我在图形视图没有设置,导致DataGridView里多出字段来
我需要的是数据库 SELECT出来的字段正好是我DataGridView里的字段,而DataGridViewTextBoxColumn这列显示的也正好是我数据库里的查出来的值,当我鼠标点击下拉框的时候,DataGridViewTextBoxColumn 该列再出现一个数据源,是下拉数据源,比如说
{{value:男,index:0},{value:女,index:1},{value:未知,index:3}}
怎么做,也就是有两数据源的概念
这个是数据库查出来的,那么这个 Shipdate这列就应该是第一行是男,第二行是女,当我点击这列时候再出现 “男 女 未知”这个数据源给我选
它没有绑定,我没设字段,设了会报错,代码怎么绑它,它有两个数据源的概念啊,一个是SELECT出来数据库表里真正的值,一个是点击给予下拉的数据源
3: 未知 。 数据库 如果读出来是 女 那么 这下面的COMB 就选中为女 ,然后你可以改变其中的值 变成选男,然后OK 就可以把 男 更新到对应数据里。
大体是这样吧。
1.数据源还是原来的。dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定
2.dataGridView2每一列的DataPropertyName都要写上sql中对应的字段。
3.DataGridViewComboBoxColumn的DataSource处绑定{{value:男,index:0},{value:女,index:1},{value:未知,index:3}},并设定DisplayMember和ValueMember
{
DataGridViewComboBoxColumn shipdate = (DataGridViewComboBoxColumn)dataGridView2.Columns["Shipdate"]; DataTable dtSex = new DataTable();
dtSex.Columns.Add("Value");
dtSex.Columns.Add("Name");
DataRow drSex;
drSex = dtSex.NewRow();
drSex[0] = "0";
drSex[1] = "男";
dtSex.Rows.Add(drSex);
drSex = dtSex.NewRow();
drSex[0] = "1";
drSex[1] = "女";
dtSex.Rows.Add(drSex);
drSex = dtSex.NewRow();
drSex[0] = "2";
drSex[1] = "未知";
dtSex.Rows.Add(drSex);
shipdate.ValueMember = "Value";
shipdate.DisplayMember = "Name";
shipdate.DataSource = dtSex;
}
''' grid中的下拉框必须要处理一下,不然会报(对象必须实现iconvertible)错误
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <res></res>
Private Sub RepositoryItemComboBox1_ParseEditValue(ByVal sender As System.Object, ByVal e As DevExpress.XtraEditors.Controls.ConvertEditValueEventArgs)
Try
e.Value = e.Value.ToString()
e.Handled = True
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try
End Sub
你看看吧!vb的代码,不过应该一样。
1.你在绑定datagridview时,DataGridViewComboBoxColumn 这一列绑定的值是不是数(0,1,2)?
2.你在设定绑定下拉列表列的时候是如何设定的?
下面给你一个我这边绑定的代码(界面设定和你类似,多了设定DataPropertyName)。 //这边是数据绑定的代码,其中第二列是DataGridViewComboBoxColumn
DataTable dt= new DataTable("ForTest");
dt.Columns.Add("Column1", Type.GetType("System.Int32"));
dt.Columns.Add("Column3", Type.GetType("System.String"));
DataRow y;
y = dt.NewRow();
y["Column1"] = 1;
y["Column3"] = 1;
dt.Rows.Add(y);
DataTable dtSex = new DataTable();
dtSex.Columns.Add("Value");
dtSex.Columns.Add("Name");
DataRow drSex;
drSex = dtSex.NewRow();
drSex[0] = "0";
drSex[1] = "男";
dtSex.Rows.Add(drSex);
drSex = dtSex.NewRow();
drSex[0] = "1";
drSex[1] = "女";
dtSex.Rows.Add(drSex);
drSex = dtSex.NewRow();
drSex[0] = "2";
drSex[1] = "未知";
dtSex.Rows.Add(drSex); DataGridViewComboBoxColumn columnCbx = ((DataGridViewComboBoxColumn)dataGridView1.Columns[1]);
columnCbx.ValueMember = "Value";
columnCbx.DisplayMember = "Name";
columnCbx.DataSource = dtSex;
dataGridView1.DataSource = dt;
SELECT 语句查出来的结果集
就是这两列
temptable.Columns.Add("index");
temptable.Columns.Add("value");
((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).Resizable = DataGridViewTriState.False;
for (int no = 0; no < 3; no++)
{
temptable.Rows.Add((no).ToString(), string.Format("{0} {1}", (no).ToString(), moji_saki_kubun(no))); }
((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DataSource = temptable;
((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DisplayMember = "value";
((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).ValueMember = "index";moji_saki_kubun 里 写的就是你 获取到的 所有下拉框绑定的东西
取初始值的时候 grid_homon_saki.Rows[i].Cells[1].Value = s.value.ToString(); 直接写就好
dt[i].tosting是你从数据库 明确值的那个
然后 更新就和TEXT形式的GRID什么的也就都一样了。
grid_homon_saki 就是我这个画面的 DATAGRIDVIEW
你把要绑定的东西 查出来 放到个list_a里面
for (int no = 0; no < list_a.count; no++)
{
temptable.Rows.Add(list_a[no])
}
这样就把整列的COMB 都绑定上了这一组数据了
至于查出来其他初始值 和 更新进去的时候 就已经和原来这一列 是不是COMB 关联不大了 和是TEXT形式的做法是一样 一样的了
就是查出来原始记录这一列还是不显示
我现在只要图形化界面一设置DataPropertyName
或者加代码
this.dataGridView2.Columns[1].DataPropertyName = "Shipdate";都会报错,不加,它就在我后面再添加SELECT出来的字段名
((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).DisplayMember = "Name";
((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).ValueMember = "Name";因为我数据库里放的也值,所以这里也要写值,不能写value