none
C#winform Dataset与DataGridview RRS feed

  • 问题

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;

    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            Sqlstring Sqlstr = new Sqlstring();
            DsTest ds = new DsTest();

            private void Form2_Load(object sender, EventArgs e)
            {
                string Sql="SELECT SupplierID, SupplierName, SupplierLinkMan, SupplierMobile, SupplierPhone, SupplierFax, SupplierBank, SupplierBankAccountNumber, ";
                Sql += "SupplierShouKuanZhangHu FROM  tb_SupplierInformation";
                SqlDataAdapter da = new SqlDataAdapter(Sql, Sqlstr.GetCon());
                da.Fill(ds, "SupplierView");
                dataGridView1.DataSource = ds.Tables["SupplierView"];
            }

            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                dataGridView1.DataSource = ds.SupplierView.Select("SupplierName like'%" + textBox1.Text.Trim() + "%'");
            }
        }
    }
    执行粗体代码时提示datagridview提示发生异常:无法将类型为System.DBNull强制转换为System.String

    求教高手帮忙解决。


    Raymond

    2012年2月28日 13:20

答案

  • DataTable.Select 方法 ()

    回傳是DataRow[],已不是原本的DataTable了哦!

    如果還是DataTable的話,請用DefaultView.RowFilter
    dataGridView1.DataSource = ds.SupplierView.Select("SupplierName like'%" + textBox1.Text.Trim() + "%'");
    //=> 改成
    ds.Tables["SupplierView"].RowFilter ="SupplierName like'%" + textBox1.Text.Trim() + "%'";
    dataGridView1.DataSource = ds.Tables["SupplierView"].DefaultView.ToTable();


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月1日 7:51

全部回复

  •  把  string Sql="SELECT SupplierID, SupplierName, SupplierLinkMan, SupplierMobile, SupplierPhone, SupplierFax, SupplierBank, SupplierBankAccountNumber, "; 改为下面的

    string Sql="SELECT SupplierID, SupplierName=ISNULL(SupplierName,''), SupplierLinkMan, SupplierMobile, SupplierPhone, SupplierFax, SupplierBank, SupplierBankAccountNumber, ";

    2012年2月28日 14:25
  • 请检查一下您那段的SQL(Form2_Load)中是否有那个栏位有Null值的呢!

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月28日 15:59
  • DsTest是我构建的一个Dataset,我的功能是打开窗体时将数据表中的记录缓存到DataSet中,然后根据所需的条件通过Textbox控件传值,对DataSet中DataTable"SupplierView"进行查询。由于数据表中并非每一列都有数据,因此,DataTable中也不会每一列都有值。奇怪的是第一次数据加载,即from_load时,DataGridView并不会出错,而当应用TextBox_Changeed对DataSet中对应的DataTable进行查询并重新给DataGridView绑定数据时确出现了如上述所问的问题。附注:有空值的列很多,但仅仅最后一列出现这样的错误提示。请帮忙指点一下。谢谢!


    Raymond


    Error Prompt
    • 已编辑 Raymond Rex 2012年2月29日 2:52 补充信息
    2012年2月29日 2:43
  • dear

    1.有可能是dataGridView的ColumnsType设定造成,你是否有使用非Textbox以外的设定?

    2.建议先不要用DataGridView进行资料输出,先丢到DataSet或DataTable,确认资料真的有捞到

    http://www.dotblogs.com.tw/yc421206/archive/2011/01/04/20553.aspx

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年2月29日 4:27
  • 今天用2010测试时又有新发现,当使用DataSet.DataTable.Select()方法重新对DataGridView进行数据绑定时出现如下图样式的DataGridView。

    这四列时运行后自动增加出来的,请问知道这是为什么或我哪里弄错了?


    Raymond

    2012年3月1日 6:13
  • DataTable.Select 方法 ()

    回傳是DataRow[],已不是原本的DataTable了哦!

    如果還是DataTable的話,請用DefaultView.RowFilter
    dataGridView1.DataSource = ds.SupplierView.Select("SupplierName like'%" + textBox1.Text.Trim() + "%'");
    //=> 改成
    ds.Tables["SupplierView"].RowFilter ="SupplierName like'%" + textBox1.Text.Trim() + "%'";
    dataGridView1.DataSource = ds.Tables["SupplierView"].DefaultView.ToTable();


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月1日 7:51
  • 是的,回传时DataTable已经改变了,实际上就是对同一个datagridview重新绑定一次数据。

    我试过你说的方法了,RowFilter是DataView的属性,不是DataTable的,所以ds.Tables["SupplierView"].RowFilter写不出来,或者是不是我漏了什么?请不吝赐教。谢谢!


    Raymond

    2012年3月1日 10:00
  • 根据你的方法,我又试了另一个绑定方式,就是直接把DataGridView.DataSource绑定到DataView.Table上,就实现了。

    但是不知道这样会不会多占用内存?因为,原本DataSet中已经有一个Table了,现在又多了一个View.

    且关于对同一个DataGridView的数据源进行动态多次绑定会出错的问题我上无法解决,我希望能知其然并知其所以然,所以如果你知道原因,请告诉我。不胜感谢。


    Raymond

    2012年3月1日 10:08
  • 您好,您可以试一下,dataGridView1.DataSource = null;
    DataView转出DataTable时,会多吃一些内存,但应该不会一直吃上去吧!
    您可以用工具(如ANTS Memory Profiler)看内存是不是有一直吃上去!

    ds.Tables["SupplierView"].RowFilter ="SupplierName like'%" + textBox1.Text.Trim() + "%'";
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = ds.Tables["SupplierView"].DefaultView.ToTable();

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年3月1日 10:25