<asp:Panel ID="Panel1" runat="server" class="Exam">一、单选题<span>(每题<%=dt.Rows[0]["E_RadioScore"].ToString() %>分)</span></asp:Panel>
    <asp:Repeater ID="Repeater1" runat="server"  onitemdatabound="Repeater1_ItemDataBound">
    <ItemTemplate>
        <div class="Examtitle"><%# Eval("No","{0}、") %><asp:Label ID="Label1" runat="server" Text='<%# Eval("Ra_Title") %>' /></div>
        <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("Ra_ID") %>' />
        <asp:RadioButtonList ID="RadioButtonList1" runat="server" DataTextField="RL_Title" DataValueField="RL_IsYes">
        </asp:RadioButtonList>
    </ItemTemplate>
    </asp:Repeater>
后台:public DataTable dt;
    public DataTable answerdt;
    public int min;
    int subID;
    int id;
    int AnswerID;
    protected void Page_Load(object sender, EventArgs e)
    {
        id = Convert.ToInt32(Request.QueryString["id"]);
        dt = new ExamManager().GetByID(id);
        min = Convert.ToInt32(dt.Rows[0]["E_Min"].ToString());
        subID=Convert.ToInt32(Convert.ToInt32(dt.Rows[0]["Subject_ID"].ToString()));
        if (!IsPostBack&&Session["user"] == null)
        {
            PageBase.alert(Page, "请先登陆");
            return;
        }
        if (!IsPostBack)
        {
            ViewState["user"] = Session["user"];
            ViewState["time"] = DateTime.Now;
        }
        DataTable SessionDT = (DataTable)ViewState["user"];
        int vipid=Convert.ToInt32(SessionDT.Rows[0]["V_ID"].ToString());
        if ((new AnswerManager().GetByVipAndExam(vipid, id, 1).Rows.Count > 0 || new AnswerManager().GetByVipAndExam(vipid, id, 0).Rows.Count > 0) && !IsPostBack)
        {
            Page.ClientScript.RegisterClientScriptBlock(GetType(), "key", "alert('您已经考过本次试卷,不能重复考试')", true);
            return;
        }
        if (!IsPostBack)
        {
            AnswerID = new AnswerManager().Add(vipid, id, 0);
            ViewState["AnswerID"] = AnswerID;
            Bind();
        }
        else
            AnswerID = Convert.ToInt32(ViewState["AnswerID"]);
        answerdt = new AnswerManager().GetByID(AnswerID);
        try
        {
            min = Convert.ToInt32(dt.Rows[0]["E_Min"].ToString()) - Convert.ToInt32(answerdt.Rows[0]["Min"].ToString());
        }
        catch { return; }
    }    protected void Bind()
    {
        DataTable radiodt=new RadioManger().GetByExam(subID);
        foreach(DataRow row in radiodt.Rows)
            new AnswerSaveManager().Add(AnswerID, "0", (int)row["Ra_ID"], 1);
        ///单选题绑定
        Repeater1.DataSource = radiodt;
        Repeater1.DataBind();
    }    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            RadioButtonList rlist = e.Item.FindControl("RadioButtonList1") as RadioButtonList;
            HiddenField hid = e.Item.FindControl("HiddenField1") as HiddenField;
            DataTable rdt = new RadioListManger().Get(Convert.ToInt32(hid.Value));
            rlist.DataSource = rdt;
            rlist.DataBind();
            //foreach (DataRow row in rdt.Rows)
            //    rlist.Items.Add(new ListItem(row["RL_Title"].ToString(), row["RL_IsYes"].ToString()));
        }
    }    
    protected void Button2_Click(object sender, EventArgs e)
    {
        new AnswerSaveManager().Del(AnswerID);
        for (int i = 0; i < Repeater1.Items.Count; i++)
        {
            RadioButtonList r = Repeater1.Items[i].FindControl("RadioButtonList1") as RadioButtonList;
            HiddenField hid = Repeater1.Items[i].FindControl("HiddenField1") as HiddenField;
            int answer = r.SelectedIndex + 1;//这里的selectedIndex怎么调试都是0和1
            new AnswerSaveManager().Add(AnswerID, answer.ToString(), Convert.ToInt32(hid.Value), 1);
        }        DateTime start = (DateTime)ViewState["time"];
        TimeSpan ts = DateTime.Now-start;
        int min = Convert.ToInt32(ts.TotalMinutes);
        new AnswerManager().EditMin(AnswerID, min);
        ViewState["time"] = DateTime.Now;
    }高手帮我看下,单选题我有四个选项,比方我有四题,我分别选中A,B,C,D相当于数据库的1,2,3,4可数据库存的四个数据是1,1,1,2(应该存的是1,2,3,4)我调试看的数组count都为4个答案,为什么就SelectIndex为什么总是选中项和我的不同?为什么答案会这样?

解决方案 »

  1.   

    for (int i = 0; i < Repeater1.Items.Count; i++)
            {
                RadioButtonList r = Repeater1.Items[i].FindControl("RadioButtonList1") as RadioButtonList;
                HiddenField hid = Repeater1.Items[i].FindControl("HiddenField1") as HiddenField;
                //再次遍历RadioButtonList 的Items 判断checked
                int answer = r.SelectedIndex + 1;//这里的selectedIndex怎么调试都是0和1
                new AnswerSaveManager().Add(AnswerID, answer.ToString(), Convert.ToInt32(hid.Value), 1);
            }
      

  2.   


    int answer = 0;
                int selectindex=0;
                foreach (ListItem li in r.Items)
                { 
                    ++selectindex;
                    if (li.Selected)
                        answer = selectindex;
                }
    还是一样的效果
      

  3.   

    干嘛要用索引来存放      用value   存放 不好么?
      

  4.   

    每题的分值不同,value绑定的是分数再者,他索引都获取不到2和3,用value存放也一样获取的0和1的value
      

  5.   

    r.SelectedItem.Text "生物质能" string
    r.Items.Count 4 int
    r.Items[0].Text "核能" string
    r.Items[1].Text "生物质能" string
    r.Items[2].Text "太阳能发电" string
    r.Items[3].Text "风力发电" string上面是我调试的结果,界面上面选的是C,也就是索引2,这里调试出来是选的B,对这个问题吊死了一天时间了
      

  6.   

    不要只在 Button2_Click事件冲寻找问题。可能是你Page_Load事件影响RadioButton选择的值.
      

  7.   

    但load事件里面没有再次绑定的啊,全过程就绑定了一次