日期:2014-05-18  浏览次数:20486 次

gridview中droplistdown出现问题了
希望各位高手帮我解决这个问题,或者给出另一个解决办法。
我使用的vs2005,C#语言。我做了一个WEB程序,设计了一个用户管理模块。我使用的是membership类和roles类。
我的功能很简单就是查看用户的如下信息:用户名,EMail,是否在线,权限。
编辑功能:只修改EMail和权限。
步骤:1、我创建了一个类ManageUser,它的一个方法如下:
C# code

public static MembershipUserCollection GetAllusers()
    {
        int a = Membership.GetAllUsers().Count;
        return Membership.GetAllUsers(0, 5, out a);
    }


2、在页面中拖放一个gridview控件,id为“gridview2”
3、配置数据源为“对象”,其select方法为GetAllusers()
4、通过以上三个步骤呢,就在gridview中显示了系统中所有的用户及其信息,删除其他字段,只保留了“用户名,EMail,是否在线”
5、MembershipUserCollection类中并不包含用户角色这个字段,所以我在gridview中添加了一个TemplateField列,定义如下:
  <asp:TemplateField HeaderText="角色">
  <EditItemTemplate>
  <asp:DropDownList ID="DropDownList1" runat="server">
  <asp:ListItem>管理员</asp:ListItem>
  <asp:ListItem>普通用户</asp:ListItem>
  </asp:DropDownList>
  </EditItemTemplate>
  <ItemTemplate>
  <asp:Label ID="Label3" runat="server"></asp:Label>
  </ItemTemplate>
  </asp:TemplateField>
6、为了显示用户的序号,我又添加了一个TemplateField列
 <asp:TemplateField HeaderText="序号"></asp:TemplateField>
7、序号是第一列,然后依次是:UserName,Email,IsOnline,角色,编辑,删除。给“序号”和“角色”赋值的代码如下:
 protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
  {
  if (e.Row.RowIndex != -1)
  {
  int id = e.Row.RowIndex + 1;
  e.Row.Cells[0].Text = id.ToString();
  GridViewRow gvr = (GridViewRow)e.Row;
  ((Label)gvr.FindControl("Label3")).Text = Roles.GetRolesForUser(e.Row.Cells[1].Text)[0];
  }
  }
8。现在呢,我想点击“编辑”的时候,出现DropDownList,我为类ManageUser添加了一个方法:
public static void Updata(string UserName)
  {

  }
是数据源编辑的方法,我没有写任何代码,是因为我想把给用户从新赋予角色的代码,由
DropDownList来实现。
现在的问题就在于,当我点击“编辑”时,发生了错误,提示为:
未将对象引用设置到对象的实例。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误: 

行 27: GridViewRow gvr = (GridViewRow)e.Row;
行 28: ((Label)gvr.FindControl("Label3")).Text = Roles.GetRolesForUser(e.Row.Cells[1].Text)[0];  

我叙述了一大堆,希望把问题说清楚了,请大家帮忙解决一下。  
 



------解决方案--------------------
你最好养成一个习惯,就是设置一个断点去检查,这样很容易就发现问题出在哪了
------解决方案--------------------
C# code
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
           //ItemTemplate的内容
            if ((e.Row.RowState & DataControlRowState.Edit) != 0)
            {
             //EditItemTemplate的内容     
            }
        }
    }

------解决方案--------------------
C# code

//直觉是这样

((Label)gvr.FindControl("Label3")).Text = 
  Roles.GetRolesForUser(((DropDownList)(e.Row.Cells[1].Controls[0])).SelectedValue);