简单问题关于ViewState(100分)

world007 2007-09-23 09:25:57
view.aspx.cs文件中:
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
ItemOperation io=new ItemOperation();//自定义的一个类
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
}
}

public int FormatVoteCount(String itemCount)
{
int VoteCount=Int32.Parse(ViewState["VoteCount"].ToString());
return ((Int32.Parse(itemCount) * 100 /VoteCount);
}
在view.aspx文件中有控件:
<asp:datagrid id="DataGrid1" runat="server" Width="352px"
AutoGenerateColumns="False" Height="80px" DataKeyField="ItemID">
<Columns>
<asp:BoundColumn DataField="ItemName" HeaderText="投票项目">
<HeaderStyle Width="3cm"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="ItemCount" HeaderText=" 投票数">
<HeaderStyle Width="3cm"></HeaderStyle>
</asp:BoundColumn>
<asp:TemplateColumn>
<HeaderStyle Width="5cm"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
<ItemTemplate>
<asp:Image id=Image2 runat="server" Height="4px"
Width='<%#FormatVoteImage(FormatVoteCount(DataBinder.Eval(
Container.DataItem,"ItemCount").ToString()))%>'
ImageUrl="Images/vote.bmp" BackColor="Navy">
</asp:Image>
<%# FormatVoteCount(DataBinder.Eval(Container.DataItem, "ItemCount").ToString())%>%
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>

编译时出现如下错误:
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 56:public int FormatVoteCount(String itemCount)
行 57:{
行 58: int VoteCount=Int32.Parse(ViewState["VoteCount"].ToString());
行 59: return ((Int32.Parse(itemCount) * 100 /VoteCount);
行 60:}
为什么会有这样的问题呢请高手////////////////////

...全文
369 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xudongyh 2007-09-24
  • 打赏
  • 举报
回复
接分了
BearRui 2007-09-23
  • 打赏
  • 举报
回复
因为你先伴定,DataGrid1.DataBind();后跟着就会执行gridview的绑定代码,也就会执行FormatVoteCount,而这个时候下面的代码还没执行:

ItemOperation io=new ItemOperation();
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
m_Count = io.GetVoteCount();


所以FormatVoteCount中取到的m_Count 就为0 了
octverve 2007-09-23
  • 打赏
  • 举报
回复
你真应该买本书看,这样就可能省许多时间和少费些劲
world007 2007-09-23
  • 打赏
  • 举报
回复
啊对了太thank you 了 能讲WHY?要结贴了
BearRui 2007-09-23
  • 打赏
  • 举报
回复
try:注意顺序

// 在此处放置用户代码以初始化页面
SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppSettings["SQLConnString"]);
// Label1.Text="ksfjkskfj";
if (!Page.IsPostBack)
{

//初始化投票项目操作类
ItemOperation io=new ItemOperation();
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
m_Count = io.GetVoteCount();
Label1.Text= m_Count.ToString();

SqlCommand comm=new SqlCommand("select * from VoteItem",Conn);
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds,"Vote");
DataGrid1.DataSource=ds.Tables["Vote"].DefaultView;
DataGrid1.DataBind();
}

public int FormatVoteCount(String itemCount)
{
int VoteCount=m_Count;
if (Page.IsPostBack)
{
VoteCount = Int32.Parse(ViewState["VoteCount"].ToString());
}
return ((Int32.Parse(itemCount) * 100 /VoteCount);
}
kkun_3yue3 2007-09-23
  • 打赏
  • 举报
回复
怎么又成绑定了...不是问viewstate么
BearRui 2007-09-23
  • 打赏
  • 举报
回复
把你Page_Load代码全贴出来看下
world007 2007-09-23
  • 打赏
  • 举报
回复
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
SqlConnection Conn = new SqlConnection(ConfigurationSettings.AppSettings["SQLConnString"]);
// Label1.Text="ksfjkskfj";
if (!Page.IsPostBack)
{
SqlCommand comm=new SqlCommand("select * from VoteItem",Conn);
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds,"Vote");
DataGrid1.DataSource=ds.Tables["Vote"].DefaultView;
DataGrid1.DataBind();
//初始化投票项目操作类
ItemOperation io=new ItemOperation();
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
m_Count = io.GetVoteCount();
Label1.Text= m_Count.ToString();
}
}
world007 2007-09-23
  • 打赏
  • 举报
回复
恩是的
BearRui 2007-09-23
  • 打赏
  • 举报
回复
写在什么位置,Page_Load中?
world007 2007-09-23
  • 打赏
  • 举报
回复
SqlCommand comm=new SqlCommand("select * from VoteItem",Conn);
SqlDataAdapter da=new SqlDataAdapter(comm);
DataSet ds=new DataSet();
da.Fill(ds,"Vote");
DataGrid1.DataSource=ds.Tables["Vote"].DefaultView;
DataGrid1.DataBind();
BearRui 2007-09-23
  • 打赏
  • 举报
回复
你在那里绑定gridview的,把绑定代码贴出来看看
world007 2007-09-23
  • 打赏
  • 举报
回复
34 是对的
BearRui 2007-09-23
  • 打赏
  • 举报
回复
中断看看io.GetVoteCount();的植是多少
world007 2007-09-23
  • 打赏
  • 举报
回复
BearRui(AK-47)(奋斗目标:农妇,山泉,有点田) :
按你的方法编译时说 return ((Int32.Parse(itemCount) * 100 /VoteCount); System.DivideByZeroException: 试图除以零。
BearRui 2007-09-23
  • 打赏
  • 举报
回复
可以,但session,但如果同1个用户开多个这个页面的话就可能冲秃
world007 2007-09-23
  • 打赏
  • 举报
回复
BearRui(AK-47)(奋斗目标:农妇,山泉,有点田) :
那我改为session可以吧 因为它是到服务器端的
BearRui 2007-09-23
  • 打赏
  • 举报
回复
改成这样:

private int m_Count = 0;
Page_Load(){
if (!Page.IsPostBack)
{
ItemOperation io=new ItemOperation();//自定义的一个类
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
m_Count = io.GetVoteCount();
}
}

public int FormatVoteCount(String itemCount)
{
int VoteCount=m_Count;
if (Page.IsPostBack)
{
VoteCount = Int32.Parse(ViewState["VoteCount"].ToString());
}
return ((Int32.Parse(itemCount) * 100 /VoteCount);
}
BearRui 2007-09-23
  • 打赏
  • 举报
回复
if (!Page.IsPostBack)
{
ItemOperation io=new ItemOperation();//自定义的一个类
//获取总投票数
ViewState["VoteCount"] = io.GetVoteCount();
}
}

public int FormatVoteCount(String itemCount)
{
int VoteCount=Int32.Parse(ViewState["VoteCount"].ToString());
return ((Int32.Parse(itemCount) * 100 /VoteCount);
}
-----------------------------------

原因,在第一次执行FormatVoteCount的时候,viewstate还没有保存,记住viewstate是保存到客户端的,所以第一次加载页面的时候是取不到viewstate的,ASP.NET只会在系统postback后才回取到viewstate
world007 2007-09-23
  • 打赏
  • 举报
回复
net_lover(【孟子E章】) :
ViewState["VoteCount"] 一开始Load的时候:ViewState["VoteCount"] = io.GetVoteCount();
调试的时候:ViewState["VoteCount"] =34 意味了ViewState["VoteCount"]是不为空的
加载更多回复(4)

62,070

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧