【C#】投票系统

用C#写网站后台时的记录

该功能要实现的内容有,动态的发布投票,可以任意的添加投票项,可以实现单选和多选的功能并提示用户输入。

首先编写发布投票的内容,数据库设计。由于要动态的添加,所以需要两个表,一个VOTE表存储投票的标题,类型,一个VOTEITEM表存储投票的每一个投票项,两者之间用ID连接。

数据库设计如下

T_VOTE(ID(PRIMARY KEY),VOTENAME,VOTEKIND,VOTETIME)

T_VOTEITEM(VOTEID,VOTEITEMCONTEXT,VOTENUM)

动态添加的实现代码:

页面部分

       

创建投票

        

标题:

        

种类:单选" GroupName="voteKind" Checked="true" />

        多选" GroupName="voteKind" />

        

            

                

  • 候选项1
  •                 

  • 候选项2
  •                 

  • 候选项3
  •                 

  • 候选项4
  •                 

  • 候选项5
  •                 

  • 候选项6
  •                 

  • 候选项7
  •                 

  • 候选项8
  •                 

  • 候选项9
  •                 

  • 候选项10
  •             

                +增加更多选项

                

                    

  • 候选项11
  •                 

  • 候选项12
  •                 

  • 候选项13
  •                 

  • 候选项14
  •                 

  • 候选项15
  •                 

  • 候选项16
  •                 

  • 候选项17
  •                 

  • 候选项18
  •                 

  • 候选项19
  •                 

  • 候选项20
  •             

            

            

    发布投票" οnclick="voteAddSubmit_Click" />

       

        

    通过JAVASCRIPT动态的添加候选项,如果不用添加则不需要填写;

    处理页部分

            string title = voteTitle.Text;

            string kind = "1";

            if (voteKindSingle.Checked == true)

            {

                kind = "0";

            }

            SqlConnection mystr = new SqlConnection();

            mystr.ConnectionString = "Data Source=mike;Initial Catalog=jishengWebSite;User ID=sa;Password=123456;Pooling=False";

            mystr.Open();

            SqlCommand cmd = new SqlCommand();

            cmd.Connection = mystr;

            //先插入标题,获取插入id

            string command = @"INSERT INTO T_Vote (VoteName,VoteKind,VoteTime) VALUES (@name,@kind,getdate())";

            cmd.CommandText = command;

            cmd.Parameters.AddWithValue("@name", title);

            cmd.Parameters.AddWithValue("@kind", kind);

          

            //执行

           int val=cmd.ExecuteNonQuery();

            //获取返回id

           command = @"execute VoteId '"+title+"'";

           cmd.CommandText = command;

            int vote_id = Convert.ToInt32(cmd.ExecuteScalar());

            //如果标题插入成功

            if (vote_id > 0 && val == 1)

            {

                //遍历投票项

                foreach (Control c in votePanel.Controls)

                {

                    if (c.GetType().ToString() == "System.Web.UI.WebControls.TextBox")

                    {

                    

                        TextBox txtTemp = c as TextBox;

                        string item = txtTemp.Text;

                        string itemid = txtTemp.ID;

                        string id = vote_id.ToString();

                       

                        if (item != "")

                        {

                            string sql_item = @"INSERT INTO T_VoteItem (VoteId,VoteItemContext,VoteItemNum) VALUES (@" + itemid + ",@" + itemid + "_con,0)";

                            cmd.CommandText = sql_item;

                            cmd.Parameters.AddWithValue("@" + itemid, id);

                            cmd.Parameters.AddWithValue("@" + itemid + "_con", item);

                           

                            cmd.ExecuteNonQuery();//执行插入投票选项

                        }

                    }

                }

            }

            mystr.Close();

        }

    原理是先实现将标题插入VOTE表,若成功,遍历PANEL内的空间找到候选的文本框不为空的项,通过字符串拼接将数据循环存入VOTEITEM表中。

    第二个设计的是投票列表的显示,这个参考前面的文章列表显示和数据传输就可以解决。

    第三个设计的是投票功能和投票结果。

    页面代码

             AutoGenerateColumns="False" DataKeyField="VoteID" >

              

              投票编号<%# DataBinder.Eval(Container.DataItem,"voteid") %>

                  票数

                      >

                  内容

                      >

                  

                  

                       

                      

                  

            

            投票" OnClick="VoteBtn_Click" />

    投票成功 

            此投票为单项选择,请重新选择" Visible="False">

    通过一个DATAGRID数据网格来查看数据,将自动设置数据字段设置成FLASE,在代码处写模板,将后台绑定的数据显示在页面上,并且加上复选框。

    加入提交的按钮,在旁边设置两个LABLE控件,将其设置为不可见,内容分别为投票成功与不成功的提示信息。

    处理页代码

       protected void VoteBtn_Click(object sender, System.EventArgs e)

        {

     SqlConnection mystr = new SqlConnection();

            mystr.ConnectionString = "Data Source=mike;Initial Catalog=jishengWebSite;User ID=sa;Password=123456;Pooling=False";

            mystr.Open();

            SqlCommand cmd = new SqlCommand();

            cmd.Connection = mystr;

            string command = "select votekind from T_Vote where id=" + Convert.ToInt32(datagrid1.DataKeys[0].ToString());

            cmd.CommandText = command;

            bool issingle = Convert.ToBoolean(cmd.ExecuteScalar());

            votemassage2.Visible =false;

            if (issingle)

            {//多选

                foreach (DataGridItem item in datagrid1.Items)

                { //查找每个投票项目的选择控件

                    CheckBox check = (CheckBox)item.FindControl("VoteCheck");

                    Label votecontext = (Label)item.FindControl("voteitemcontext");

                    Label votenum = (Label)item.FindControl("voteitemnum");

                    if (check != null)

                    { //说明用户已经投票,则需要添加这一票

                        if (check.Checked == true)

                        {

                            int num = Convert.ToInt32(votenum.Text.ToString());

                            num = num + 1;

                            command = "execute P_AddVoteNum '" + Convert.ToInt32(datagrid1.DataKeys[item.ItemIndex].ToString()) + "','"

                                + votecontext.Text + "','" + num + "'";

                            cmd.CommandText = command;

                            cmd.ExecuteScalar();

                        }

                    }

                }

                VoteMessage.Visible = true;

            }

            else

            {//单选

                int checknum = 0;

                foreach (DataGridItem item in datagrid1.Items)

                {

                    CheckBox check = (CheckBox)item.FindControl("VoteCheck");

                    if (check.Checked!=false)

                    {

                        checknum++;

                    }

                }

                    if (checknum == 1)

                    {

                        foreach (DataGridItem item in datagrid1.Items)

                        { //查找每个投票项目的选择控件

                            CheckBox check = (CheckBox)item.FindControl("VoteCheck");

                            Label votecontext = (Label)item.FindControl("voteitemcontext");

                            Label votenum = (Label)item.FindControl("voteitemnum");

                            if (check != null)

                            { //说明用户已经投票,则需要添加这一票

                                if (check.Checked == true)

                                {

                                    int num = Convert.ToInt32(votenum.Text.ToString());

                                    num = num + 1;

                                    command = "execute P_AddVoteNum '" + Convert.ToInt32(datagrid1.DataKeys[item.ItemIndex].ToString()) + "','"

                                        + votecontext.Text + "','" + num + "'";

                                    cmd.CommandText = command;

                                    cmd.ExecuteScalar();

                                }

                            }

                        }

                        VoteMessage.Visible = true;

                    }

                    else

                    {

                        votemassage2.Visible = true;

                    }

                   

                }

            }

    这里只提供投票按钮的代码,数据绑定部分参考前面的文档就可以实现。

    首先用查询语句将数据库中对应的投票类型取出来,投票编号由投票裂变传送得到。

    判断单选,多选,用IF语句分别写出处理代码,多选时遍历所有的复选框,将选中的复选框对应的内容和投票编号取到,在数据库中就可以确定一条数据,将投票数字段取出来加以后再更新即可。单选时先遍历复选框,统计用户选择了多少个复选框,若多与一个则提示用户选择出错,单个就重复多选的插入代码。

    要点:1如何取得绑定的投票内容,编号,和投票数。

    在页面出数据绑定的时候不要直接将数据放在表格的单元格里,使用自己命名的LABLE控件,这样在处理也遍历控件的时候就可以取到对应的值了

              2,要熟记遍历控件和数据库语句执行的代码


    你可能感兴趣的:(C#)