已解决

【精华】投票系统调试的时候有些问题已解决

学员:ntwuhaohao提问时间:2008-10-13 13:41:10

1.在投票系统:对某明星进行投票,点上传之后,数据提交不到数据库里,设置断点,发现int starid = e.Item.ItemIndex;接收不到数据。不知哪里出错。
整体代码如下
protected void datalist1_update(object sender, DataListCommandEventArgs e)
{
int starid = e.Item.ItemIndex;
SqlConnection strconn = dbmange.getconn();
strconn.Open();
SqlCommand cmd = new SqlCommand("voteroom", strconn);
cmd.CommandType = CommandType.StoredProcedure;
......................
......................
......................
......................
}
2.投票页里有三个linkbutton控件,都设了CommandName属性,但并没有发面哪里调用它,设它有什么作用?
3。投票页里点了投票,相应的投票项就出来了,这是怎么实现的?
4。每次我提交的作业里面没有.sln文件,老师是怎么运行调试的,我如果这个项目文件夹拷到其它机子上,没有.sln文件,怎么调试啊?

采纳为答案

回答人:polarstar (.NET学习顾问)回答时间:2008-10-14 02:14:44

1。int starid = e.Item.ItemIndex;所得到的是正在编辑的DataList元素的索引,不正确,应该是int starid = datalist1.DataKeys(e.Item.ItemIndex),得到正在编辑数据的标识,即数据库中用来表示记录唯一性的那个字段值,因为把DataList的DataKeyField设成了starid,所以可以得到这个starid。
2。在DataList中,命令Update、Delete、Cancel和Edit是固定的命令,他们会激活UpdateCommand、DeleteCommand、CancelCommand和EditCommand事件(GridView也有类似的行为,但有一点点区别),所以当你点击设置了CommandName的LinkButton后,就自动调用对应事件函数。你把CommandName="Update"改成
CommandName="Update1"它就不起作用了。
3。你点了“投票”后,相当于是点击了一个CommandName为Edit的LinkButton,如2所述,它会激发EditCommand事件函数,在这个事件函数中有datalist1.EditItemIndex = e.Item.ItemIndex,这就是设置DataList的这个数据为编辑状态,而我们在DataList中设置了<EditItemTemplate>……</EditItemTemplate>模板,当状态为“编辑”状态是,就会显示这个模板,所以投票项就出来了。

学员对该答案的评价 感谢各位老师

其他回答

回答人:polarstar (.NET学习顾问)回答时间:2008-10-13 21:30:37
非常抱歉,我找了很久没有找到投票系统的源码。
我先回答一下4吧,你把源码下载的连接告诉我吧,谢谢!
打开网站可以用两个方式打开:
1。文件->打开->项目/解决方案,这里选择sln文件,可以打开网站项目。
2。如果没有sln,可以使用:文件->打开->网站,在弹出的对话框中,可以打开远程站点、IIS站点、文件系统等等,这里选择的对象是文件夹。当打开相应的文件夹网站后,编译运行时,如果没有sln,VS就会提示是否创建sln解决方案,这是你还可以选择把sln放在任何一个目录,这样就创建了sln了,下次就可以用它打开。
回答人:amandag(高歌 .NET学习顾问)回答时间:2008-10-13 23:53:49
Page_Load事件中如果绑定数据是否做了如下判断?
if(!IsPostBack)
{
//绑定数据
}
回答人:polarstar (.NET学习顾问)回答时间:2008-10-14 02:37:29
对上一个回复的1作一个说明。
发现这是老师的课件的写法,这样写是错误的。e.Item.ItemIndex得到的是DataList元素的索引,即0、1、2、3……相当于数组下标,这个值跟数据库里面的starid字段值没有任何关系,因为starid的值是递增的,它是1、2、3、……所以用e.Item.ItemIndex的值加1能和starid的值对应起来,但是这样设计会带来问题,如果我删除了数据库中的某个记录,starid的值就不是递增的了,它可能是1、4、6……,这样下次在投票就会乱。
回答人:ntwuhaohao回答时间:2008-10-14 09:07:53
张老师这么晚了还不休息啊,要劳逸结合哈!
接上面的回复:在不加datalist.datakeys的情况下,比如对第三项进行投票
int starid = e.Item.ItemIndex; //starid值为0,为什么不管对哪项投票它的值都是0???
cmd.Parameters.Add("@starid", SqlDbType.Int, 4); //starid的值变成了2,这是怎么实现的
...........................................................................................
加了datalist.datakeys的情况下:
int starid =Convert.toint32.datakeys([e.Item.ItemIndex]); //starid值为0,为什么不管对哪项投票它的值都是0???
cmd.Parameters.Add("@starid", SqlDbType.Int, 4); //这时候starid的值变成了11(数据库中第三条记录的编号),它是怎么转换的???
回答人:polarstar (.NET学习顾问)回答时间:2008-10-14 19:04:55
今天电脑坏了,一天没上网。
你在Page_Load代码里面是否重新调用数据绑定函数,绑定前是否加了判断If Not IsPostBack?
如果加了的话int starid = e.Item.ItemIndex;不可能总是0,你可能是在这行代码设置了断点,然后执行到断点时它是0的,因为此时这行代码还没有执行,所有当继续往下执行的时候它的值就变了,你看看是不是这样,不可能一个变量没有对它赋值会自动改变,如果这样微软就惨了。
回答人:潘志红回答时间:2008-10-14 20:23:07
1. 对于int starid = e.Item.ItemIndex只适用于特定数据库的情况,即正好starinfo表中的starid正好按从0开始顺序增1,如果不是这样,int starid= datalist1.DataKeys(e.Item.ItemIndex)是正确的。因为这个实例不能太大,因此明星库只做了添加,而省略了对明星库的编辑、插入、删除的操作,因此starid是按从零开始递增。
2.在对datalist控件html代码定义时,要有<DataKeyField="starid">,即指定主键。不然可能会出现“int starid = e.Item.ItemIndex; //starid值为0,为什么不管对哪项投票它的值都是0”。
3.在DataList中,命令Update、Delete、Cancel和Edit是固定的命令,他们会激活UpdateCommand、DeleteCommand、CancelCommand和EditCommand事件(GridView也有类似的行为,但有一点点区别),所以当你点击设置了CommandName的LinkButton后,就自动调用对应事件函数。你把CommandName="Update"改成
CommandName="Update1"它就不起作用了。polarstar说法是正确的。
回答人:polarstar (.NET学习顾问)回答时间:2008-10-14 21:19:47
如果没有设置DataKeyField="starid",我想执行到datalist1.DataKeys(e.Item.ItemIndex)应该会出错。