zoukankan      html  css  js  c++  java
  • 网上投票的制作(.net)

    网上投票几乎是当今网站不可缺少的一部分,而制作的方式却有多种,大多数静态网站采用的方法是利用多个radioButton逐一添加内容来实现,而动态网站多采用radioButtonList控件绑定数据库,从而动态获得投票内容。

    1.数据库的设计(MSSQL)

    如果是流量比较大的网站,则更新投票内容是频繁的工作,好的数据库设计可以让更新相对科学和容易.

    先设计一个主表,它记录投票的主题与参与该投票的人数:

    create database vote
    
    use vote
    
    create table voteMaster
    (
    voteID int primary key,
    voteTitle varchar(100) not null,
    voteSum int default 0
    )
    
    insert into voteMaster values(1,'尤文降级,米兰被剥夺欧冠,您认为判决是否合理?',0)
    
    insert into voteMaster values(2,'您如何评价舍甫琴科告别米兰?',0)

    然后设计从表,它记录了相关主题的详细项目:

    create table voteDetails
    (
    voteID int foreign key references voteMaster(voteID),
    voteDetailsID int not null,
    voteItem varchar(100) not null,
    ItemSum int default 0,
    primary key(voteID,voteDetailsID)
    )
    
    insert into voteDetails values(1,1,'非常合理',0)
    
    insert into voteDetails values(1,2,'不太合理,判罚过重',0)
    
    insert into voteDetails values(1,3,'说不清楚',0)
    
    insert into voteDetails values(2,1,'迎接新的开始,米兰舍瓦双赢',0)
    
    insert into voteDetails values(2,2,'痛失射手王,米兰将一蹶不振',0)
    
    insert into voteDetails values(2,3,'切尔西未必好呆,舍瓦选错了',0)
    
    insert into voteDetails values(2,4,'不好说',0)

    2.得到投票主题

    新建立一个DB类,用来返回数据库连接对象,这样做的好处是:如果以后数据库有变化,则只需要修改这个类:

    public static SqlConnection createConnection()
    {
        SqlConnection conn = new SqlConnection("server=.;database=vote;uid=sa;pwd=millfox");
        return conn;
    }

    在设计好的投票栏里添加一个Lable(服务器控件)和RadioButtonList,然后编写代码动态得到主题和内容:

    private string voteId = "1"; //将用这个字符串变量来控制投票主题
    
    private void Page_Load(object sender, System.EventArgs e)
    {
        // 在此处放置用户代码以初始化页面
        
        if(!IsPostBack)
        {
            SqlConnection conn = DB.createConnection();
            conn.Open();
            
            //得到标题信息
            string select = "SELECT voteTitle FROM voteMaster WHERE voteID="+voteId;
            SqlCommand cmd = new SqlCommand(select,conn);
            string voteTitle = Convert.ToString(cmd.ExecuteScalar());
            this.lblTitle.Text = voteTitle;
            
            //数据绑定到radioButtonList
            string getItem = "SELECT voteDetailsID,voteItem FROM voteDetails WHERE voteID="+voteId;
            SqlCommand cmdItem = new SqlCommand(getItem,conn);
            SqlDataReader sdr = cmdItem.ExecuteReader();
            this.rbtnItems.DataSource = sdr;
            this.rbtnItems.DataTextField = "voteItem";
            this.rbtnItems.DataValueField = "voteDetailsID";
            this.rbtnItems.DataBind();
            sdr.Close();
            conn.Close();
        }
    }

    这样绑定了数据库的Label和RadioButtonList就能显示出主题及相关内容了,而切换不同的主题,只需要修改之前定义的变量voteId的值。

    3.投票

    投票要实现的功能,就是点击button后,相应主题的项目票数加1,主题的票数也要加1。在已添加的button(btnVote)上编写代码:

    private void btnVote_Click(object sender, System.EventArgs e)
    {
        SqlConnection conn = DB.createConnection();
        conn.Open();
        
        //更新从表中的itemSum项,条件为voteID为当前指定值,且voteDetailsID为当前选中项的值
        string ItemSum = "UPDATE voteDetails SET ItemSum=ItemSum+1 WHERE voteDetailsID ="+this.rbtnItems.SelectedValue+"and voteID="+this.voteId;
        
        SqlCommand cmd = new SqlCommand(ItemSum,conn);
        cmd.ExecuteNonQuery();
        conn.Close();
    }

    上面有个方法很常用,那就是radioButtonList的SelectedValue,它能得到当前选定项的Value值。

    现在发现了一个问题,那就是无法将主表中的票数与从表中的票数联系起来,而我们想要的是从表中某项的值加1,主表中的票数也要增加1,于是自然想到要添加一个Trigger:

    create trigger voteMaster_update on voteDetails
    
    for update
    
    as
    
    begin
    
    Update voteMaster Set voteSum=voteSum+1 Where voteID=(select voteID from inserted)
    
    end

    这样投票部分就完成了。

    4.查看

    我们希望查看到的一般就是:各项得到的票数、多少人参与投票(即总票数)

    我们先将投票页面的voteId值通过btnView(查看)传递出去:

    private void btnView_Click(object sender, System.EventArgs e)
    {
        Response.Redirect("ShowResult.aspx?voteID="+this.voteId);
    }

    新建一个aspx文件,编写如下代码:

    private void Page_Load(object sender, System.EventArgs e)
    {
        // 在此处放置用户代码以初始化页面
        
        //得到通过btnView(查看)传递过来的参数
        string getID = Request.QueryString["voteID"].ToString();
        
        SqlConnection conn = DB.createConnection();
        conn.Open();
        
        //得到标题
        string getTitle = "SELECT voteTitle FROM voteMaster WHERE voteID="+getID;
        
        //得到总票数
        string getSum = "SELECT voteSum FROM voteMaster WHERE voteID="+getID;
        SqlCommand cmd = new SqlCommand(getTitle,conn);
        
        //显示标题
        this.lblTitle.Text = cmd.ExecuteScalar().ToString();
        
        //显示总票数
        cmd = new SqlCommand(getSum,conn);
        this.lblSum.Text = "共有"+cmd.ExecuteScalar().ToString()+"人参加投票";
        
        string getAll = "SELECT * FROM voteDetails WHERE voteID="+getID;
        SqlCommand exec_cmd = new SqlCommand(getAll,conn);
        SqlDataReader sdr = exec_cmd.ExecuteReader();
        
        //利用DataReader的游标显示出从表中的项目与总和
        while(sdr.Read())
        {
            Response.Write("<div align=center><font color=red>"+sdr.GetString(2)+" - "+sdr.GetInt32(3)+"票</font></div><p>");
        }
        sdr.Close();
        conn.Close();
    }

    点击查看,将显示出相关信息:

    非常合理 - 4票

    不太合理,判罚过重 - 2票

    说不清楚 - 0票

    尤文降级,米兰被剥夺欧冠,您认为判决是否合理? 

    共有6人参加投票

  • 相关阅读:
    《实战Java高并发程序设计》读书笔记一
    《实战Java高并发程序设计》读书笔记二
    SprintBoot学习(三)
    SprintBoot学习(二)
    SprintBoot学习(一)
    jQuery学习(三)
    jQuery学习(二)
    jQuery学习(一)
    利用activeX控件在网页里自动登录WIN2003远程桌面并实时控制
    上传读取Excel文件数据
  • 原文地址:https://www.cnblogs.com/CoderWayne/p/4484250.html
Copyright © 2011-2022 走看看