我想输入一个班的学生成绩,先从数据库读出一个班的信息如姓名和学号,然后生成一张输入表,每行包括学生姓名和学号,以及一个成绩输入框.如下图:我应该用什么控件呢?gridview?reapter?,我现在是用了一个gridview,但是,那个输入框中的分数我如何获取?还有,分数不应该是字母什么的,我该如何验证它的有效性呢?对了,我想输入完成绩按回车键跳到下一个输入框,应该怎么操作?最后保存成绩的时候,如果有100个学生,是不是要100条update语句啊?可不可以循环更新呢?关键是每个班的学生数不固定,所以这些update语句怎么写呢?怎么把一个分数更新到对应的学生那条记录上啊?谢谢!---------------
题外话:发现这种情况下,还是asp灵活的多,取得记录集后在table中循环<tr>...

解决方案 »

  1.   

    gridview第一二列绑定相关信息,其他列使用模板列
    foreach(GridViewRow gr in GridView1.Rows)
    {
    TextBox txt=gr.FindControl("txt1")as TextBox;}
    可使用onblur等验证输入值或使用验证控件
    GridView1_RowDataBound中
     ((TextBox)e.Item.FindControl("txt1")).Attributes["onkeydown"] = "if(event.keyCode==13){document.getElementById('" +txt.ClientID + "').focus();return false;};";
      

  2.   

    直接用字符创拼html,然后脚本控制,不建议使用控件
      

  3.   

    使用repeater。然后遍历repeater,对repeater中的textbox进行赋值
    楼主可以试试看!
      

  4.   

    说实话,不是想吵架,但直的有点BS LZ 没有理解自己要达到的要求用现有工具能否实现。就说ASP。NET不好,ASP好。好。那你还用什么。直接用ASP写就完了呗!每一样工具都有他自己的特性。即使它真的满足不了你,那是因为你的思路太窄,你大可以用别的或N个方法一起来实现吧!
      

  5.   

    楼主不正被这位老兄气晕了嘛。anyqu兄台,我也不想吵架。我以前是用asp的,但现在转.net平台,正是因为自己不会用而来论坛求指教而不是求骂啊,莫明其妙就被你鄙视了,你说我容易嘛?你都说我可以用别的方法来实现,所以正因为我不会才来求助于你们啊,我只是最后说了下在这种情况下asp会容易实现,就被你一个大帽子扣下来说我认为asp.net不好。我认为asp.net不好我会用40分问这个问题啊?谢谢所有给我帮助的朋友!to gdlpc:我的要求在一开始就说清楚了噢。 主要是最后写数据库的语句,如何写不固定条数的update语句。
      

  6.   

    你这不就是批量添加学习成绩么? 在but按钮事件里面一个循环不就搞定了? 用GridView。
      

  7.   

    一条update。然后一个循环GridView获取ID。根据ID去修改成绩。用事物也行。
      

  8.   

    1,有这么费劲么,你弄一个模板 ,一下都倒进去了!
    =============================
    2,导入成功的在gridview 显示,不成功的也显示,
    3,有个button 可以把成功的都保存到,数据里!批量的!
      

  9.   

    参考下面的例子:
    如果你的表名是ScoreSheet,主键是Id,字段是Name,Room,Seat,Score,那可以这样写:<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
    <form id="form1" runat="server"><!-- DataKeyNames填写表的主键,这样GridView就会记录每行的主键,在保存分数的时候可以知道该分数对应的学生 -->
    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="false" DataKeyNames="Id" >
    <Columns>
    <asp:BoundField DataField="Name" HeaderText="姓名" />
    <asp:BoundField DataField="Room" HeaderText="考场号" />
    <asp:BoundField DataField="Seat" HeaderText="座位号" />
    <asp:TemplateField HeaderText="编辑">
    <ItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" onkeydown="if (event.keyCode==13) { return event.keyCode=9; }"></asp:TextBox>
    <asp:RegularExpressionValidator runat="server" ControlToValidate="TextBox1" ValidationExpression="\d+"
     ErrorMessage="分数必须是数字" Display="Dynamic" />
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView><asp:Button ID="Button1" runat="server" Text="保存成绩" OnClick="Button1_Click" Enabled="false" /><!-- 下面的连接串和查询语言改成你的数据库情况 -->
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="server=localhost;uid=sa;pwd=xxx;database=xxx"
     SelectCommand="select * from ScoreSheet">
    </asp:SqlDataSource></form>
    </body>
    </html><script runat="server">
    void Button1_Click(object sender, EventArgs e)
    {
    // 从数据库中读出成绩表
    DataView dv = SqlDataSource1.Select(new DataSourceSelectArguments()) as DataView;
    dv.Sort = "Id";

    foreach (GridViewRow row in GridView1.Rows)
    {
    object id = GridView1.DataKeys[row.RowIndex].Value; // id是记录在GridView中的该行的主键
    string score = (row.FindControl("TextBox1") as TextBox).Text;
    dv[dv.Find(id)]["Score"] = score == "" ? 0 : Convert.ToInt32(score); // 该行中存入分数
    } // 写回数据库
    SqlDataAdapter adapter = new SqlDataAdapter();
    string cmd = "update ScoreSheet set Score=@Score where Id=@Id";
    adapter.UpdateCommand = new SqlCommand(cmd, new SqlConnection(SqlDataSource1.ConnectionString));
    adapter.RowUpdating += delegate(object sender1, SqlRowUpdatingEventArgs e1)
    {
    e1.Command.Parameters.Clear();
    e1.Command.Parameters.Add(new SqlParameter("Id", e1.Row["Id"]));
    e1.Command.Parameters.Add(new SqlParameter("Score", e1.Row["Score"]));
    };
    adapter.Update(dv.Table); Response.Write("保存成功");
    Response.End();
    }</script>
    btw, asp可以实现的方式,大多数在asp.net下面也可以用相似的方法实现,也就是说你可以按照写asp代码的思路来写asp.net程序,应该也能完成,不过这样就失去了asp.net的语言优势带来的编码的简洁高效。不要轻易下结论,等你了解了asp.net就会改变看法的。