原来DataSource可以直接指向SqlDataReader,哈哈,学习。
不过
datagrid1.DataSource=sqldatareader1;
datagrid1.DataBind();
放在循环中,多次绑定,恐怕不太合适,试试下面的
if(sqldatareader1.Read())
{
datagrid1.DataSource=sqldatareader1;
datagrid1.DataBind();
}

解决方案 »

  1.   

    原来DataSource可以直接指向SqlDataReader,哈哈,学习。
    不过
    datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    放在循环中,多次绑定,恐怕不太合适,试试下面的
    if(sqldatareader1.Read())
    {
    datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    }
      

  2.   

    因为do…while先操作再判断,所以不管怎么样,它都会执行至少一次操作.即使数据库中没有数据,它也会试图去读取,因此出错﹔
    而至于while少读一条,但用do…while才能读全,也是同样的原因
      

  3.   

    改成这样试试:
    datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    while (sqldatareader1.Read())
    {
    lable1.Text=sqldatareader1.GetString(1);
    };
    看看是什么结果,我没试过.
      

  4.   

    当datareader读出数据后,需要一次read方法使指针指向第一条纪录。如果不掉用read方法则会出现没有纪录的错误。用While就实现调用了一次read方法,才能使getstring(1)生效,用do则没有调用read方法就是用了getstring(1),所以就会出现错误。
      

  5.   

    你们干吗呀?有datagrid1.DataSource=sqldatareader1; 这样写的吗?晕
    ArrayList list = new ArrayList();
    while (sqldatareader1.Read())
    {
    list.Add(sqldatareader1.GetString(1));
    datagrid1.DataSource=list;
    datagrid1.DataBind();
    };
      

  6.   

    sorry 复制错了
    ArrayList list = new ArrayList();
    while (sqldatareader1.Read())
    {
    list.Add(sqldatareader1.GetString(1));
    };
    datagrid1.DataSource=list;
    datagrid1.DataBind();
      

  7.   

    但为什么先while(sqldatareader1.Read()),再
    datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    反而会少第一条记录呢?
      

  8.   

    首先要说的是datareader对象可以作为datagrid的数据源,只是在调用datagrid.dataBind方法之前不能关闭datareader对象.否则会报错.
    datareader对象是只读和只前的,每从前移一条记录,就会把前一条记录的数据丢弃.
      

  9.   

    楼上说的没错,没人用datagrid1.DataSource=sqldatareader1;这种写法是因为谁会只取一条数据(而且是最后一条)
      

  10.   

    Do{ datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    }while (sqldatareader1.Read());
    可是这样确实取出了数据,而且是全部正确的数据啊?
    --------
    while (sqldatareader1.Read())
    {datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();}
    少第一条,但几乎所有的书上和帮助中,却都是这么写的.
    --------
    为什么会这样!
    =====================
    handsomebird123(handsomebird123):
    ArrayList list = new ArrayList();是做什么用的?
    我要取的数据已经在sqldatareader1中了!
    =====================
    chyich() :
    while (sqldatareader1.Read())
    { lable1.Text=sqldatareader1.GetString(1);
    datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();};
    为什么会少一条记录呢?虽然lable1.Text=sqldatareader1.GetString(1);被多次执行,但应该也可以啊.
      

  11.   

    无论是:
    Do{ datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
    }while (sqldatareader1.Read());
    还是:
    while (sqldatareader1.Read())
    {datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();}
    这样的绑定方法都不对,因为这样的话每读一条数据就绑定一次,其实上只要绑定一次就可以了,象这样:datagrid1.DataSource=sqldatareader1;
    datagrid1.DataBind();
      

  12.   

    原来是这样,终于明白这一点了:)谢谢!!!那么除了datagrid1的绑定外,还要绑定lable1.Text,怎么做最方便呢?
    是再生成一个datareaer吗?
    还是可以直接利用绑定datagrid1的那个,好象不能直接用,是吗?
      

  13.   

    一样的,DataGrid是绑定到它的模板内的控件上,而Label是绑定到它的Text属性上。
      

  14.   

    我的意思是:还需要重新生成一个datareader,去绑定Label.Text吗?
    datagrid1.DataBind();之后,游标到了最后,不能再绑定Label.Text了。是吗?
      

  15.   

    如果你的Label控件不在DataGrid的模板内,那么把一个DataReader绑定到DataGrid后,就没办法再用一个Label来显示它的数据了,如果象你说的把相同的数据源绑定到多个控件上,最好还是用DataTable或DataSet。