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);