none
dataGridView中使用一列combox,保存dataSet时没有combox的数据。 RRS feed

  • 问题

  • 我有一个dataGridView,绑定了一个dataSet,的一个table1

    比如说第一列是“水果名称”,第二列是“重量”,第三列是“单价”
    水果名称的赋值只能是我指定的几种水果,所以我希望能用一个combox,让用户选择其中的一个。
    我使用这个:
        DataGridViewComboBoxColumn dtComb = new DataGridViewComboBoxColumn();
                dataGridView1.Columns.Add(dtComb);

    在dataGridView的最后一列添加了一列combox。

    给combox列的选项赋值:
                dtComb.DataSource = dataSet2.Tables[0];
                dtComb.DisplayMember = "Fruit";

    当我使用dataSet.AcceptChanges()
    dataSet.WriteXML("mydataset.xml");
    保存当前gridView的数据。
    但是好像这一列combox的当前数据没有保存进去……


    我想实现的就是,
    1 用gridView现实一个表格
              已经完成。  
                dataGridView1.DataSource = dataSet;
                 dataGridView1.DataMember = tableName;

    <img src="(http://i3.6.cn/cvbnm/d6/79/ed/228f4f87277b5a02c588c8987b71ba67.jpg)">

    2. 表格的第三列,在编辑时,它的取值只能是我指定的几个值。

    因为对编程不是很熟悉。所以想请给个思路。
    现在我只是实现了,添加了一列combox,把它绑定到我的一列上面。(这一列的值就是我的指定值)。

    • 已编辑 阿朵 2009年7月16日 5:27
    2009年7月16日 2:15

答案

全部回复

  • 你好,你每次在 ComboBox 中选择时应把选中的的 Key 写入到 DataSet 中去
    知识改变命运,奋斗成就人生!
    2009年7月16日 4:27
    版主
  • dtComb.DisplayMember = "Fruit";
    这只是表面显示
    需要指定 ValueMember才能保存到dataset
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年7月16日 5:06
    版主
  • 你好,你每次在 ComboBox 中选择时应把选中的的 Key 写入到 DataSet 中去
    知识改变命运,奋斗成就人生!

    我也想实现这样,combox列的每一个格子选择时,修改对应的dataSet。
    不知道怎么写代码。
    2009年7月16日 5:32
  • dtComb.DisplayMember = "Fruit";
    这只是表面显示
    需要指定 ValueMember才能保存到dataset
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。

    我也加了valueMember,

                DataGridViewComboBoxColumn dtComb = new DataGridViewComboBoxColumn();

                dtComb.DataSource = dataSet2.Tables[0];
                dtComb.ValueMember = "AlloyIndex";
                dtComb.DisplayMember = "AlloyIndex";
              

                dataGridView1.Columns.Insert(3, dtComb);

    但,最后保存时:
           dataGridView1.EndEdit();
                 dataSet.AcceptChanges();
                 dataSet.WriteXml(fileName);

    xml文件还是没有变,没有添加的combox那一列。

    2009年7月16日 5:33
  • dtComb.DataPropertyName = "xxx";
    知识改变命运,奋斗成就人生!
    2009年7月16日 5:46
    版主
  • dtComb.DataPropertyName = "xxx";
    知识改变命运,奋斗成就人生!

    可能您没明白我的意思。
    dtComb并不是我要编辑和保存的对象,它只是用来显示可供赋值的范围的。

    我要编辑的对象是gridView所绑定的table.只是,我在对这个table的其中一列进行赋值时 ,只能在我combox说提供的选项内进行选择。

    这个我不知道怎么实现。我现在只是在gridView里添加了一个combox列,但是我怎么根据这个combox的当前值对我的dataSet进行修改……
    2009年7月16日 6:59
  • 就是将你的 Combobox 选的值与 DataTable 的中某个字段关联起来,让你选择Combobox后程序会自动更新数据集中的值,xxx 代表一个存在的字段名
    知识改变命运,奋斗成就人生!
    2009年7月16日 7:26
    版主
  • 就是将你的 Combobox 选的值与 DataTable 的中某个字段关联起来,让你选择Combobox后程序会自动更新数据集中的值,xxx 代表一个存在的字段名
    知识改变命运,奋斗成就人生!

    表一:table1
    fruit       weight   price
    苹果          12       1.2
    桔子          13       1.3        

    我用dataGridView1绑定这个表格,并显示。
    我在编辑fruit列时,我希望它只能选择 table2.colomn1: {苹果,桔子,香蕉,菠萝}这其中的一个。
    所以我在dataGridView1里添加了一列 DataGridViewComboBoxColumn dtComb = new DataGridViewComboBoxColumn();,并使这一列和 table2.colomn1绑定(我预定的水果列表)。所以它就能下拉显示{苹果,桔子,香蕉,菠萝}。但是,这时候comboBoxColumn列和的table1似乎是孤立的,我改变comBox的选择,对我的table1没有任何影响。


    如果使dtComb和table1的"fruit"绑定的话,虽然能够联动更改table1的数据,但是这样的话,它的下拉选项就显示table1的"fruit"列而不是table2里面的水果列表了。 我希望combox的下拉列表和table2的列绑定,当前值和table1的列绑定……

    • 已编辑 阿朵 2009年7月16日 8:04
    2009年7月16日 7:57
  • 你好,刚才回复了你的另一个帖子,有源代码。你看看
    知识改变命运,奋斗成就人生!
    2009年7月16日 7:59
    版主
  • 你好!
         最后保存时:
           dataGridView1.EndEdit();
           dataSet.AcceptChanges();//去掉这行试试!
           dataSet.WriteXml(fileName);

    周雪峰
    2009年7月16日 8:33
    版主
  • 你好,刚才回复了你的另一个帖子,有源代码。你看看
    知识改变命运,奋斗成就人生!


    非常感谢~有点明白了。
    我这边还有个问题就是,我的dataGridView绑定的table是从xml里面读出来的,就是一个table了。
    我不是一列一列的绑的:  
                fDataGridView.Columns.Add(fColumn1);
                fDataGridView.Columns.Add(fColumn2);
                fDataGridView.Columns.Add(fColumn3);
    我是
                dataGridView1.DataSource = dataSet;
                dataGridView1.DataMember = tableName;

    这样绑定的。
    所以,我如果添加添加那一列combox的话,表格就维数不一样了。。。

    我这样:
     //产品数据
                dataSet.ReadXml(fileName);   //从文件中读取表

                dataGridView1.DataSource = dataSet;   //把它绑定在dataGridView上
                dataGridView1.DataMember = tableName;

                //那个选择的拉框
                 dataSet2.ReadXml("selectItem.xml");  //下拉框的选择项,从文件读出
                 BindingSource fBindingSource = new BindingSource(dataSet2, "Items"); //绑定到Items表
                 dtComb.DataSource = fBindingSource;
                 dtComb.DisplayMember = "Fruit";  //显示这一列
                 dtComb.ValueMember = "Fruit";
                 dtComb.DataPropertyName = "Fruit";

             //加进去    
              dataGridView1.Columns.Insert(2, dtComb);

    这样似乎dataGridView和dataSet.[tableName]的列数就不一样了。。

    现在它一运行就不停的提示dataGridView发生异常,dataGridViewComBoxCell值无效。程序无法运行,只能用任务管理器关掉。这个似乎和上一行文字的无关。不知道什么原因……我的值似乎都没有什么特殊设置的。


                
               
                dtComb.HeaderText = "Select Cureve";
              //  dataGridView1.Columns.RemoveAt(3);

                dataGridView1.Columns.Insert(2, dtComb);

    2009年7月16日 8:40
  • 你这里需要自己设置绑定列
    知识改变命运,奋斗成就人生!
    • 已标记为答案 阿朵 2009年7月16日 9:37
    2009年7月16日 8:46
    版主
  • 非常感谢版主的帮忙。^_^
    2009年7月16日 9:36