注册 登录
编程论坛 ASP.NET技术论坛

[求助]listbox问题

jflin 发布于 2007-03-28 10:34, 1433 次点击

我在选择了listbox的数据项之后,点编辑按钮去到编辑页面,这时出现了下面的错误:

异常详细信息: System.FormatException: 输入字符串的格式不正确。

源错误:

private void Page_Load(object sender, System.EventArgs e)
{
行 29: if(Request.Params["NewsID"] != null)
行 30: {
行 31: nNewsID = Int32.Parse(Request.Params["NewsID"].ToString());//红色字体显示
行 32: }

请问该怎么解决这个问题啊?谢谢

21 回复
#2
skyland842007-03-28 10:36
哦!你传来的参数 可能不单只有数字而已 才会出现这样的问题!这个 你可以看看  你传来的地址里 的东西是不是出问题了
#3
bygg2007-03-28 11:15
用 Request.QueryString[]  试试.
#4
冰镇柠檬汁儿2007-03-28 11:20

楼主用的是2005吗?你写的NewsID是什么呢?会不会得到的值是非数字的字符串啊,感觉就是在Int32.Parse的时候出了问题

#5
windstores2007-03-28 11:22
用Convert.ToInt32试下
#6
冰镇柠檬汁儿2007-03-28 11:25
楼上等于没说
#7
Kendy1234562007-03-28 11:50
我的意见和2楼4楼一样

转换前先判断一下 newsid这个参数的数据类型
#8
jflin2007-03-28 11:52

我把我的代码贴出来,大家帮我改下好吗?好像在显示数据时代码有误:
listbox页面的代码如下:

private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{ ///绑定新闻种类的数据
BindNewsData(nNewsID);
}
// 在此处放置用户代码以初始化页面
}
private void BindNewsData(int nNewsID)
{
///清空News列表中的原始数据
NewsList.Items.Clear();
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"];
con.Open();
string Provincesql = "SELECT * FROM News";
SqlDataAdapter adapter = new SqlDataAdapter(Provincesql, con);
DataSet ds = new DataSet();
adapter.Fill(ds, "Title");
//NewsList.DataSource=ds;
//NewsList.DataBind();
//显示数据中新闻的标题
for(int i=0;i<ds.Tables[0].Rows.Count;i++)

{
NewsList.Items.Add(ds.Tables[0].Rows[i]["Title"].ToString());
}

}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.editbtn.Click += new System.EventHandler(this.editbtn_Click);
this.delbtn.Click += new System.EventHandler(this.delbtn_Click);
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion


private void Button1_Click(object sender, System.EventArgs e)
{
Response.Redirect("addnews.aspx");
}
private string FormatTitle(string sTitle)
{
if(sTitle.Length > 50)
{
return(sTitle.Substring(50) + "...");
}
else
{
return(sTitle);
}
}

private void editbtn_Click(object sender, System.EventArgs e)
{
if(NewsList.SelectedIndex > -1)
{ ///跳转到新闻修改页面,同时携带参数新闻ID
Response.Redirect("~/EditNews.aspx?&NewsID=" + NewsList.SelectedValue);
}
else
{
Response.Write("<script>alert(\"请选择你的数据项!\")</script>");
}
}

private void delbtn_Click(object sender, System.EventArgs e)
{
}



编辑页面的代码如下:

private void Page_Load(object sender, System.EventArgs e)
{
if(Request.Params["NewsID"] != null)
{
nNewsID = Int32.Parse(Request.Params["NewsID"].ToString());
//nNewsID=Request.Params["NewsID"].ToString();
}
if(!Page.IsPostBack)
{
if(nNewsID > 0)
{
BindNewsData(nNewsID);
}
}
// 在此处放置用户代码以初始化页面
}
private void BindNewsData(int nNewsID)
{
if(nNewsID > 0) ///首先判断新闻ID是否大于0,否则不从数据库取数据
{ ///从数据库取到新闻ID为nNewsID的新闻的信息
//连接数据库
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"];
String cmdText = "SELECT * FROM News WHERE NewsID = '" + nNewsID.ToString() + "'";
SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
myConnection.Open();
SqlDataReader recn = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
///给新闻标题框和新闻内容框初始化数据
while(recn.Read())
{
NewsTitle.Text = recn["Title"].ToString();
NewsBody.Text = recn["Body"].ToString();
}
recn.Close();
}
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.editbtn.Click += new System.EventHandler(this.editbtn_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void editbtn_Click(object sender, System.EventArgs e)
{
if(NewsTitle.Text.Trim().Length > 0 && NewsBody.Text.Trim().Length > 0)
{ ///构建数据库连接和修改新闻的SQL语句
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"];
String cmdText = "UPDATE NEWS SET Title = '" + NewsTitle.Text + "',Body = '" + NewsBody.Text
+ "' WHERE NewsID = '" + nNewsID.ToString() + "'";
SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
///打开数据库连接并执行修改操作
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
///返回新闻管理页面
Response.Redirect("NewsManage.aspx");
}
else
{
Response.Write("<script>alert(\"新闻的标题不能为空!\")</script>");
}

}


谢谢了

[此贴子已经被作者于2007-3-28 13:43:07编辑过]

#9
sean882007-03-28 13:11
if(Request.Params["NewsID"] != null)
{
nNewsID = Int32.Parse(Request.Params["NewsID"].ToString());---这里设个段点看一下传过来的参数值是什么?如果包函字符串或者是空字符串Int32.Parse会转换出错...
//nNewsID=Request.Params["NewsID"].ToString();
}
#10
冰镇柠檬汁儿2007-03-28 13:20
以下是引用sean88在2007-3-28 13:11:49的发言:
if(Request.Params["NewsID"] != null)
{
nNewsID = Int32.Parse(Request.Params["NewsID"].ToString());---这里设个段点看一下传过来的参数值是什么?如果包函字符串或者是空字符串Int32.Parse会转换出错...
//nNewsID=Request.Params["NewsID"].ToString();
}

应该的,谁让你就听5楼的意见来着

#11
jflin2007-03-28 13:42
http://localhost/wangluo/EditNews.aspx?&NewsID=%e4%b8%ad
设了断点之后打开的网址如上,我不知道怎么改我的程序啊,请帮我指出在哪里出问题好吗?是不是listbox页面没有传NewsID过来啊?
#12
cyyu_ryh2007-03-28 13:47

就是值没传过去

#13
Kendy1234562007-03-28 13:49
以下是引用冰镇柠檬汁儿在2007-3-28 13:20:17的发言:

应该的,谁让你就听5楼的意见来着

大汗。。。看了一下。。。俺不是5楼。。。

#14
冰镇柠檬汁儿2007-03-28 13:50
以下是引用Kendy123456在2007-3-28 13:49:02的发言:

大汗。。。看了一下。。。俺不是5楼。。。

晕,又没说你

楼主应该跟一下传的值

#15
Kendy1234562007-03-28 13:52
NewsID=%e4%b8%ad 有值 而且不是数字

Response.Redirect("~/EditNews.aspx?&NewsID=" + NewsList.SelectedValue);

问题就在这里 你看一下listbox的value你是怎么设的,如果这里都没有设置成数字 后面出错就是自己找的了
#16
windstores2007-03-28 14:00

汗。。我发现我是5楼

#17
bygg2007-03-28 14:42
在传之前,先把 NewsList.SelectedValue 这个值转换成数字型再传.
#18
jflin2007-03-28 15:00

to all:listbox的value我希望它显示的是新闻的标题,NewsID不用显示出来,我的意思就是选中了新闻标题就能跳转到编辑页面,而在编辑页面根据选中的新闻标题提出NewsID,并在编辑页面显示新闻标题跟内容,我两个页面的程序都贴在这里啦,但我不知道应该怎么改,请帮我看下改出来好吗?谢谢了

#19
Kendy1234562007-03-28 15:34
Eidtnews就是你的编辑页面吧?

前面已经清楚的告诉你了 你把listbox的value作为参数送到了editnews, 然后把这个参数作为newsid读了出来。 明白毛病在哪里了没?
newsid你显示不显示不是问题,关键是你跳转编辑页面的时候 参数要送对。
解决办法就是 你选中新闻标题后 想办法先得到它对应的newsid, 再response.redirect, 而不是不负责任的就把listbox的value当参数送进去
#20
jflin2007-03-28 16:51
to Kendy123456,如你说选中新闻标题后 想办法先得到它对应的newsid,请问这步应该怎么实现??


if(NewsList.SelectedIndex > -1)
{ ///跳转到新闻修改页面,同时携带参数新闻ID
Response.Redirect("~/EditNews.aspx?&NewsID=" + NewsList.SelectedValue);
}

我选中了标题之后怎么知道我选中了哪个NewsID?是不是在上面加代码进去啊?应该怎么加?谢谢
#21
Kendy1234562007-03-28 17:05

你自己都不知道选中了哪个newsid 你在编辑页面凭什么拿newsid来编辑????
在数据库查询新闻标题的时候 同时查出id。 要么你用代码把listbox的value设置成newsid, 用个循环, 一条一条的设
要么你放一个不可见的listbox 在里面存放newsid 和放新闻标题的一个顺序
然后 NewsIdList.selectedindex = NewsList.SelectedIndex
Response.Redirect("~/EditNews.aspx?&NewsID=" + NewsIdList.text);

#22
sean882007-03-29 12:38
以下是引用jflin在2007-3-28 15:00:20的发言:

to all:listbox的value我希望它显示的是新闻的标题,NewsID不用显示出来,我的意思就是选中了新闻标题就能跳转到编辑页面,而在编辑页面根据选中的新闻标题提出NewsID,并在编辑页面显示新闻标题跟内容,我两个页面的程序都贴在这里啦,但我不知道应该怎么改,请帮我看下改出来好吗?谢谢了

ListBox Web 服务器控件介绍
ListBox 控件实际上是列表项的容器。每个列表项都是一个单独的对象,具有自己的属性:

属性 说明
Text 列表中显示的文本。
Value 与某个项关联的值。设置此属性可使您将该值与特定的项关联而不显示该值。例如,您可以将 Text 属性设置为某个职员的名字,将 Value 属性设置为该职员的电子邮件别名。
Selected 布尔值,指示该项是否被选定。如果 ListBox 被设置为允许多重选择,则可选择不止一项。

用ListBox1.Items[].Text绑定新闻的标题,ListBox1.Items[].Value绑定NewsID,就行了~~~~~~
如下:

if(NewsList.SelectedIndex > -1)
{ ///跳转到新闻修改页面,同时携带参数新闻ID
Response.Redirect("~/EditNews.aspx?&NewsID=" + ListBox1.Items[ListBox1.SelectedIndex].Value); //思路是这样,没经过测试
}

[此贴子已经被作者于2007-3-29 12:56:34编辑过]

1