在一个下拉列表框里已经有一项被默认选中,现在我是利用从数据库返回的记录来修改
其被选中项。代码如下:
SqlCommand mycomm = new SqlCommand("select 游戏ID,职业,性别,种族,主修天赋,商业技能1,商业技能2,QQ号码,手机号码,其他 from DATALIST",Mycon);
    Mycon.Open();
    SqlDataReader Fill = mycomm.ExecuteReader();
    Fill.Read();
    TexID.Text=Fill["游戏ID"].ToString();
    DDLZhiye.SelectedItem.Selected = false;
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;
Mycon是我定义的数据连接。
DDLZhiye是下拉列表框。
我先用DDLZhiye.SelectedItem.Selected = false;把默认的选中项取消,
再用DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;设置新的选中项,
但是提示我  错误:未将对象引用设置到对象的实例
如果我把这句换成DDLZhiye.Items.FindByText(“战士”).Selected = true;就没有问题。
但是这里我需要的是用变量,不是用常量啊。
求各位老大稍微指点下,谢谢拉!另外再请问下如何指定DATAGRID中某条记录的某项或者某列为可编辑,而不是整条记录可编辑。
datagrid是自动生成的。

解决方案 »

  1.   

    DDLZhiye.SelectedItem.Selected = false;这句根本不需要阿。DDLZhiye.DataSource=Fill;
    DDLZhiye.DataTextField="职业";
    DDLZhiye.DataValueField="职业";
    DDLZhiye.DataBind();
    假如:TextBox1.Text="战士";
    DDLZhiye.Items.FindByText(TextBox1.Text)Selected = true;
      

  2.   

    再用DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;设置新的选中项,
    但是提示我  错误:未将对象引用设置到对象的实例
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````
    首先,DDLZhiye.SelectedItem.Selected = false;这句根本不需要然后,出现上面的提示,说明“职业”这个字段可能存在空,也就是查出来是dbnull的格式。
    需要先转化一下,你先判断它是不是dbnull,如果是,处理一下,不是在直接附值。
      

  3.   

    谢谢 ChinaLyp(刀客陆)指点,但是还是有问题。因为我是要用SqlDataReader对象Fill中的“职业”字段作为作为数据来源,而不是文本框的,
    用来改变下拉列DDLZhiye中的被选中项目
    (里面有好几个选项,默认的是 战士,但比如记录返回 法师,我就需要把被选中项设为 法师)
    所以这句是没有变化的
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;在增加这4句后
    DDLZhiye.DataSource=Fill;
    DDLZhiye.DataTextField="职业";
    DDLZhiye.DataValueField="职业";
    DDLZhiye.DataBind();出错提示是:在没有任何数据时进行无效的读取尝试
    如果取消DDLZhiye.DataBind();这句,
    错误提示还是原来的:未将对象引用设置到对象的实例
    DataBind()会把SqlDataReader对象中的数据清空吗?
    修改的代码如下:
    if(IsPostBack == false)
    {
        SqlCommand mycomm = new SqlCommand("select 游戏ID,职业,性别,种族,主修天赋,商业技能1,
        商业技能2,QQ号码,手机号码,其他 from DATALIST 
        where 用户名='"+Session["Name"].ToString ()+"'",Mycon);
        Mycon.Open();
        SqlDataReader Fill = mycomm.ExecuteReader();
        DDLZhiye.DataSource=Fill;
        DDLZhiye.DataTextField="职业";
        DDLZhiye.DataValueField="职业";    DDLZhiye.DataBind();

        Fill.Read();
        TexID.Text=Fill["游戏ID"].ToString();  //错误行:在没有任何数据时进行无效的读取尝试
        DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;
        //在原来的代码里出现错误的行:未将对象引用设置到对象的实例    Fill.Close();
        Mycon.Close();
    }
      

  4.   

    谢谢 cliff1002(.NET中级菜鸟)的帮助
    但是在我最开始的代码里只要去掉
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;
    这个出错行,就能顺利运行
    另外数据库里在这个字段上是设置了非空限制的,“职业”字段肯定不是空的
      

  5.   

    有如下几个可能:
    1.由于你是SqlDataReader ,所以,一旦该字段内容为null时,对它取值,即会出现错误.所以,取值前必须先判断该值是否为空:
    if(Fill("") != null)
    {}
    else
    {}
    2.在下拉框中,以下语句
    DDLZhiye.Items.FindByText(Fill["职业"].ToString())
    求取出来的,是一个listitem对象,假设当前下拉框选项中没有对应的选项,则其值为null,如果在null的情况下,对它做任何设置,均出现错误.
    所以,你应修改如下:
    if(DDLZhiye.Items.FindByText(Fill["职业"].ToString()) != null)
    {
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = True;
    }具体修改如下:Mycon.Open();
        SqlDataReader Fill = mycomm.ExecuteReader();
        if(Fill.Read())
    {
    if(Fill["职业"]!=null)
    {
        //TexID.Text=Fill["游戏ID"].ToString();
        //DDLZhiye.SelectedItem.Selected = false;
        ListItem myitem = DDLZhiye.Items.FindByText(Fill["职业"].ToString());
        if(myitem != null)
    {
        myitem.Selected = true;}
    }
    }
      

  6.   

    谢谢 hchxxzx(NET?摸到一点门槛) 的指点
    这么说吧,我吧最开始的代码里出错的这句:
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;
    改成
    TexID.Text=Fill["职业"].ToString();
    就能顺利运行。
    就是说SqlDataReader的“职业”字段肯定不是空的,
    下拉列表框里也肯定有对应的项。
    说精确点:
    DDLZhiye.Items.FindByText(Fill["职业"].ToString());
    这句代码都不会出错
    出错就只在后面的.Selected = true上:
    DDLZhiye.Items.FindByText(Fill["职业"].ToString()).Selected = true;
    //错误:未将对象引用设置到对象的实例
      

  7.   

    应用 hchxxzx(NET?摸到一点门槛) 的方法终于查到问题所在
    运行这句:
    TexID.Text=Fill["职业"].ToString();
    结果就能清楚的显示出来,值是肯定有地,再和下列表里的项对比,这个值也是存在地。
    运行这句:
    if(DDLZhiye.Items.FindByText(Fill["职业"].ToString()) != null)
    结果就是false,我只能说我没语言了!
    明明直和字段都存在,他就是找不出东西来