DataGrid学习五

发布时间: 2007-01-24 11:37    作者: 未知    来源: 未知    浏览:    评论

更新数据库在 Web 应用程序中可能经常很棘手。针对这种情况,DataGrid 控件提供了一些使更新更容易的内置支持。为了允许对行进行编辑,DataGrid 支持整型 EditItemIndex 属性,该属性指示网格的哪一行应该是可编辑的。设置了该属性后,DataGrid 按该索引将行呈现为文本输入框,而不是简单的标签。值 -1(默认值)指示没有行是可编辑的。页可以在服务器端窗体中包含 DataGrid,并通过 DataGrid 的对象模型获取对编辑数据的访问。



  为了确定哪一行应该是可编辑的,需要一种方法接受用户关于他们希望编辑哪一行的输入。DataGrid 可以包含一个 EditCommandColumn 来呈现激发三个特殊事件的链接:EditCommand、UpdateCommand 和 CancelCommand。EditCommandColumn 以声明方式添加到 DataGrid 的 Columns 集合,如下面的示例所示。
<ASP:DataGrid id="MyDataGrid" runat="server"
  ...
  OnEditCommand="MyDataGrid_Edit"
  OnCancelCommand="MyDataGrid_Cancel"
  OnUpdateCommand="MyDataGrid_Update"
  DataKeyField="au_id"
>
  <Columns>
    <asp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" />
  </Columns>
</ASP:DataGrid>
  在 DataGrid 标记本身上,将事件处理程序连到从 EditCommandColumn 激发的每个命令。这些处理程序的 DataGridCommandEventArgs 参数使您得以直接访问由用来设置 DataGrid 的 EditItemIndex 的客户端选择的索引。注意,需要重新绑定 DataGrid 以使更改生效,如下面的示例所示。
public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E) {
    MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
    BindGrid();
}
Public Sub MyDataGrid_Edit(sender As Object, E As DataGridCommandEventArgs)
    MyDataGrid.EditItemIndex = E.Item.ItemIndex
    BindGrid()
End Sub
public function MyDataGrid_Edit(sender:Object, E:DataGridCommandEventArgs) : void {
    MyDataGrid.EditItemIndex = int(E.Item.ItemIndex);
    BindGrid();
}
  当编辑某行 DataGrid 时,EditCommandColumn 呈现 Update 和 Cancel 链接。如果客户端选择 Cancel,只需将 EditItemIndex 设置回 -1。但如果客户端选择 Update,则需要对数据库执行更新命令。执行更新查询要求知道希望更新的行的数据库中的主键。为支持此要求,DataGrid 公开一个可以设置为主键字段名的 DataKeyField 属性。在连到 UpdateCommand 的事件处理程序中,可以从 DataGrid 的 DataKeys 集合检索键名。使用事件的 ItemIndex 在此集合中索引,如下面的示例所示。
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)E.Item.ItemIndex];
myCommand.Parameters("@Id").Value = MyDataGrid.DataKeys(CType(E.Item.ItemIndex, Integer))
myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[int(E.Item.ItemIndex)];
在 Update 事件处理程序的最后,将 EditItemIndex 设置回 -1。下面的示例说明此代码的运行。



<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
<script language="C#" runat="server">



    SqlConnection myConnection;



    protected void Page_Load(Object Src, EventArgs E)
    {
        myConnection=new SqlConnection("server=jeff;uid=sa;password=;database=pubs");
        if (!IsPostBack)
            BindGrid();
    }



    public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs e)
    {
        MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex;
        BindGrid();
    }



    public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs e)
    {
        MyDataGrid.EditItemIndex = -1;
        BindGrid();
    }



    public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs e)
    {
        String updateCmd = "UPDATE Authors SET au_lname = @LName, au_fname = @FName, phone = @Phone, "
             + "address = @Address, city = @City, state = @State, zip = @Zip, contract = @Contract where au_id = @Id";



        SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);



        myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 11));
        myCommand.Parameters.Add(new SqlParameter("@LName", SqlDbType.NVarChar, 40));
        myCommand.Parameters.Add(new SqlParameter("@FName", SqlDbType.NVarChar, 20));
        myCommand.Parameters.Add(new SqlParameter("@Phone", SqlDbType.NChar, 12));
        myCommand.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 40));
        myCommand.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 20));
        myCommand.Parameters.Add(new SqlParameter("@State", SqlDbType.NChar, 2));
        myCommand.Parameters.Add(new SqlParameter("@Zip", SqlDbType.NChar, 5));
        myCommand.Parameters.Add(new SqlParameter("@Contract", SqlDbType.NVarChar,1));



        myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)e.Item.ItemIndex];



        String[] cols = {"@Id","@LName","@FName","@Phone","@Address","@City","@State","@Zip","@Contract"};



        int numCols = e.Item.Cells.Count;
        for (int i=2; i<numCols-1; i++) //跳过第一、第二和最后一列
        {
            String colvalue =((TextBox)e.Item.Cells[i].Controls[0]).Text;



            // 检查在所需字段中是否有空值
            if (i<6 && colvalue == "")
            {
                Message.InnerHtml = "错误:“作者 ID”、“姓名”或“电话”不允许使用空值";
                Message.Style["color"] = "red";
                return;
            }



            myCommand.Parameters[cols[i-1]].Value = colvalue;
        }



        //追加最后一行,将 true/false 值转换为 0/1
        if (String.Compare(((TextBox)e.Item.Cells[numCols-1].Controls[0]).Text, "True", true)==0)
                    myCommand.Parameters["@Contract"].Value =  "1";
        else
                    myCommand.Parameters["@Contract"].Value =  "0";



        myCommand.Connection.Open();



        try
        {
            myCommand.ExecuteNonQuery();
            Message.InnerHtml = "<b>已更新记录</b><br>" + updateCmd;
            MyDataGrid.EditItemIndex = -1;
        }
        catch (SqlException exc)
        {
            if (exc.Number == 2627)
                Message.InnerHtml = "错误:已存在具有相同主键的记录";
            else
                Message.InnerHtml = "错误:未能更新记录,请确保正确填写了字段";
            Message.Style["color"] = "red";
        }



        myCommand.Connection.Close();



        BindGrid();
    }



    public void BindGrid()
    {
        SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);



        DataSet ds = new DataSet();
        myCommand.Fill(ds, "Authors");



        MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;
        MyDataGrid.DataBind();
    }



</script>
<body style="font: 10.5pt 宋体">
  <form runat="server" ID="Form1">
   <h3><font face="宋体">更新数据行</font></h3>
   <span id="Message" EnableViewState="false" style="font: arial 11pt;" runat="server" /><p>
   <ASP:DataGrid id="MyDataGrid" runat="server" Width="800" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding="3" CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" OnEditCommand="MyDataGrid_Edit" OnCancelCommand="MyDataGrid_Cancel" OnUpdateCommand="MyDataGrid_Update" DataKeyField="au_id">
   <Columns>
    <asp:EditCommandColumn EditText="编辑" CancelText="取消" UpdateText="更新" ItemStyle-Wrap="false" />
   </Columns>
   </ASP:DataGrid>
  </form>
</body>
</html>
上一篇 DataGrid学习六 下一篇 DataGrid学习四

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多