热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DataGrid实现增删(带提示)改和分页【转】

或许大家会说,网上已经很多类似文章了,包括孟子的,为什么要再写一次?我想我们不仅仅要会实现,更多的是需要理解。


或许大家会说,网上已经很多类似文章了,包括孟子的,为什么要再写一次?
我想我们不仅仅要会实现,更多的是需要理解。
下面先帖出代码,再分析一下其中的一些关键代码。
数据库表名:tb1,其中有3个字段,分别是ID自增的主键、vName varchar(50)、iAge int
(以下代码没有做任何错误捕获处理)

前台

ExpandedBlockStart.gifContractedBlock.gif<%...&#64; Page language&#61;"c#" Codebehind&#61;"WebForm5.aspx.cs" AutoEventWireup&#61;"false" Inherits&#61;"csdn.WebForm5" %>

DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
   
<HEAD>
       
<title>WebForm5title>
       
<meta content&#61;"Microsoft Visual Studio .NET 7.1" name&#61;"GENERATOR">
       
<meta content&#61;"C#" name&#61;"CODE_LANGUAGE">
       
<meta content&#61;"Javascript" name&#61;"vs_defaultClientScript">
       
<meta content&#61;"http://schemas.microsoft.com/intellisense/ie5" name&#61;"vs_targetSchema">
   
HEAD>
   
<body>
       
<form id&#61;"Form1" method&#61;"post" runat&#61;"server">
           
<asp:textbox id&#61;"TextBox1" runat&#61;"server" Width&#61;"88px">asp:textbox>
           
<asp:TextBox id&#61;"TextBox2" runat&#61;"server" Width&#61;"40px">asp:TextBox>
           
<asp:Button id&#61;"Button1" runat&#61;"server" Text&#61;"添加">asp:Button>
           
<asp:datagrid id&#61;"DataGrid1" runat&#61;"server" AutoGenerateColumns&#61;"False" DataKeyField&#61;"ID" AllowPaging&#61;"True"
                PageSize
&#61;"5" OnEditCommand&#61;"edit" OnCancelCommand&#61;"cancel" OnUpdateCommand&#61;"update">
               
<Columns>
                   
<asp:TemplateColumn HeaderText&#61;"姓名">
                       
<ItemTemplate>
ExpandedBlockStart.gifContractedBlock.gif                           
<%...# DataBinder.Eval(Container.DataItem,"vName") %>
                       
ItemTemplate>
                       
<EditItemTemplate>
                           
<asp:TextBox id&#61;"name" Runat&#61;"server" Text&#61;&#39;<%# DataBinder.Eval(Container.DataItem,"vName") %>&#39; Width&#61;"88px">
                           
asp:TextBox>

                       
EditItemTemplate>
                   
asp:TemplateColumn>
                   
<asp:TemplateColumn HeaderText&#61;"年龄">
                       
<ItemTemplate>
ExpandedBlockStart.gifContractedBlock.gif                           
<%...# DataBinder.Eval(Container.DataItem,"iAge") %>
                       
ItemTemplate>
                       
<EditItemTemplate>
                           
<asp:TextBox id&#61;"age" Runat&#61;"server" Text&#61;&#39;<%# DataBinder.Eval(Container.DataItem,"iAge") %>&#39; Width&#61;"40px">
                           
asp:TextBox>

                       
EditItemTemplate>
                   
asp:TemplateColumn>
                   
<asp:EditCommandColumn UpdateText&#61;"更新" CancelText&#61;"取消" EditText&#61;"编辑">asp:EditCommandColumn>
                   
<asp:ButtonColumn Text&#61;"删除" CommandName&#61;"del">asp:ButtonColumn>
               
Columns>
               
<PagerStyle Mode&#61;"NumericPages">PagerStyle>
           
asp:datagrid>form>
   
body>
HTML>

后台

  using System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Data.SqlClient;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
namespace
csdn
ExpandedBlockStart.gifContractedBlock.gif
...
{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
/**/
///


   
/// WebForm5 的摘要说明。
   
///

    public class WebForm5 : System.Web.UI.Page
ExpandedSubBlockStart.gifContractedSubBlock.gif   
...
{
       
protected
System.Web.UI.WebControls.TextBox TextBox1;
       
protected
System.Web.UI.WebControls.TextBox TextBox2;
       
protected
System.Web.UI.WebControls.Button Button1;
       
protected
System.Web.UI.WebControls.DataGrid DataGrid1;
   
       
private void Page_Load(object
sender, System.EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
// 在此处放置用户代码以初始化页面

            if(!IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif           
...
{
                SetBind();
            }

        }


       
protected void SetBind()
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
            SqlConnection conn
&#61;new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlDataAdapter da
&#61;new SqlDataAdapter("select * from tb1"
,conn);
            DataSet ds
&#61;new
DataSet();
            da.Fill(ds,
"table1"
);
           
this.DataGrid1.DataSource&#61;ds.Tables["table1"
];
           
this
.DataGrid1.DataBind();
        }


ContractedSubBlock.gifExpandedSubBlockStart.gif       
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
       
override protected void OnInit(EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
//

           
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
           
//
            InitializeComponent();
           
base
.OnInit(e);
        }

       
ExpandedSubBlockStart.gifContractedSubBlock.gif       
/**////
       
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
       
///
此方法的内容。
       
///

        private void InitializeComponent()
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{   
           
this.Button1.Click &#43;&#61; new System.EventHandler(this
.Button1_Click);
           
this.DataGrid1.ItemCreated &#43;&#61; new System.Web.UI.WebControls.DataGridItemEventHandler(this
.DataGrid1_ItemCreated);
           
this.DataGrid1.ItemCommand &#43;&#61; new System.Web.UI.WebControls.DataGridCommandEventHandler(this
.DataGrid1_ItemCommand);
           
this.DataGrid1.PageIndexChanged &#43;&#61; new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this
.DataGrid1_PageIndexChanged);
           
this.Load &#43;&#61; new System.EventHandler(this
.Page_Load);

        }

       
#endregion


       
private void Button1_Click(object sender, System.EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
            SqlConnection conn
&#61;new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlCommand comm
&#61;new SqlCommand("insert into tb1 (vName,iAge) values (&#64;vName,&#64;iAge)"
,conn);
            SqlParameter parm1
&#61;new SqlParameter("&#64;vName",SqlDbType.NVarChar,50
);
            parm1.Value
&#61;this
.TextBox1.Text;
            SqlParameter parm2
&#61;new SqlParameter("&#64;iAge"
,SqlDbType.Int);
            parm2.Value
&#61;this
.TextBox2.Text;
            comm.Parameters.Add(parm1);
            comm.Parameters.Add(parm2);
            conn.Open();
            comm.ExecuteNonQuery();
            conn.Close();
            SetBind();
        }


       
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
if(e.CommandName&#61;&#61;"del"
)
ExpandedSubBlockStart.gifContractedSubBlock.gif           
...
{
                SqlConnection conn
&#61;new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
                SqlCommand comm
&#61;new SqlCommand("delete from tb1 where ID&#61;&#64;id"
,conn);
                SqlParameter parm1
&#61;new SqlParameter("&#64;id"
,SqlDbType.Int);
                parm1.Value
&#61;this
.DataGrid1.DataKeys[e.Item.ItemIndex];
                comm.Parameters.Add(parm1);
                conn.Open();
                comm.ExecuteNonQuery();
                conn.Close();
                SetBind();
            }

        }


       
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
this.DataGrid1.CurrentPageIndex&#61;
e.NewPageIndex;
            SetBind();
        }


       
protected void edit(object sender,DataGridCommandEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
this.DataGrid1.EditItemIndex&#61;
e.Item.ItemIndex;
            SetBind();
        }


       
protected void cancel(object sender,DataGridCommandEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
this.DataGrid1.EditItemIndex&#61;-1
;
            SetBind();
        }


       
protected void update(object sender,DataGridCommandEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
            SqlConnection conn
&#61;new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"
]);
            SqlCommand comm
&#61;new SqlCommand("update tb1 set vName&#61;&#64;vName,iAge&#61;&#64;iAge where ID&#61;&#64;id"
,conn);
            SqlParameter parm1
&#61;new SqlParameter("&#64;vName",SqlDbType.NVarChar,50
);
            parm1.Value
&#61;((TextBox)e.Item.FindControl("name"
)).Text;
            SqlParameter parm2
&#61;new SqlParameter("&#64;iAge"
,SqlDbType.Int);
            parm2.Value
&#61;((TextBox)e.Item.FindControl("age"
)).Text;
            SqlParameter parm3
&#61;new SqlParameter("&#64;id"
,SqlDbType.Int);
            parm3.Value
&#61;this
.DataGrid1.DataKeys[e.Item.ItemIndex];
            comm.Parameters.Add(parm1);
            comm.Parameters.Add(parm2);
            comm.Parameters.Add(parm3);
            conn.Open();
            comm.ExecuteNonQuery();
            conn.Close();
           
this.DataGrid1.EditItemIndex&#61;-1
;
            SetBind();
        }


       
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif       
...
{
           
foreach(DataGridItem di in this
.DataGrid1.Items)
ExpandedSubBlockStart.gifContractedSubBlock.gif           
...
{
               
if(di.ItemType&#61;&#61;ListItemType.Item||di.ItemType&#61;&#61;ListItemType.AlternatingItem||di.ItemType&#61;&#61;
ListItemType.EditItem)
ExpandedSubBlockStart.gifContractedSubBlock.gif               
...
{
                    ((LinkButton)di.Cells[
3].Controls[0]).Attributes.Add("onclick","return confirm(&#39;delete?&#39;);"
);
                }

            }

//一般不这么写&#xff0c;看下面说明第六点
        }

    }


&#xff08;1&#xff09;
大家可以看到SetBind()中的一些代码&#xff0c;并没有显式的打开和关闭SqlConnection但是代码确实是运作的&#xff0c;原因在于SqlDataAdqpter的Fill方法会自动打开或者关闭连接&#xff08;当然它会先检测是不是连接已经打开&#xff0c;如果已经打开的话不会重复打开导致出错&#xff09;。
&#xff08;2&#xff09;
再看一下Page_Load()中
if(!IsPostBack)
{
 SetBind();
}
很多初学者&#xff0c;不理解IsPostBack盲目的加或者不加这句话&#xff0c;其实加不加在于你的需求
IsPostBack为真的时候表示网页不是第一次加载也就是回传的情况
只有在!IsPostBack为真的时候用了SetBind();也就是绑定DataGrid的关键在于我们需要修改记录&#xff0c;这往往是很多网友在修改记录的时候发现向数据库写入的数据还是原来的TextBox中的内容。为什么会这样呢&#xff1f;在修改的时候我们先按下“编辑”这个按钮执行了protected void edit(object sender,DataGridCommandEventArgs e)里面的代码&#xff0c;在修改了TextBox中数据以后我们按下“更新”这个按钮&#xff0c;这个时候也是一次PostBack如果没有if(!IsPostBack)的话&#xff0c;其中的绑定代码执行了一次&#xff0c;也就是对模板列中的TextBox进行了重新赋值&#xff0c;然后转到
protected void update(object sender,DataGridCommandEventArgs e)中的代码&#xff0c;你的代码是执行的&#xff0c;但是((TextBox)e.Item.FindControl("name")).Text已经不是你修改的东西而是原来的东西了。
&#xff08;3&#xff09;
修改的代码中
parm3.Value&#61;this.DataGrid1.DataKeys[e.Item.ItemIndex]
对于e.Item.ItemIndex就是点击的这个行&#xff08;事件触发的行&#xff09;的行好&#xff0c;如果要用这个作为主键来放进where子句update或者delete显然是不合适的&#xff0c;比如你点击的是第三行&#xff0c;数据库内这个记录的主键却是20或者是字符&#xff0c;因此我们需要为DataGrid指定一个DataKeyField&#xff08;前台代码中&#xff09;告诉它&#xff0c;我的表的主键就是这个字段&#xff0c;在绑定了以后DataGrid的DataKeys就存储数据了列表控件中每个记录的主键&#xff0c;所以取的时候用索引
this.DataGrid1.DataKeys[e.Item.ItemIndex]来取就可以得到主键
&#xff08;4&#xff09;
看一下private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
中的一些代码&#xff0c;首先ItemCreated这个事件是在当在DataGrid控件中创建项时在服务器上发生&#xff0c;这个时候还没有绑定数据&#xff0c;所以如果在这个
ItemCreated中去取DataGrid中的值你是得不到的。
foreach(DataGridItem di in this.DataGrid1.Items)
{
if(di.ItemType&#61;&#61;ListItemType.Item||di.ItemType&#61;&#61;ListItemType.AlternatingItem||di.ItemType&#61;&#61;ListItemType.EditItem)
{
((LinkButton)di.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm(&#39;delete?&#39;);");//这里的类型转换为LinkButton&#xff0c;在不指定ButtonColumn 的ButtonType的时候默认就是LinkButton&#xff0c;如果指定为PushButton&#xff0c;这里类型转换应该写Button而不是LinkButton否则会出错
}
}
这段代码为所有的删除按钮增加客户端的click事件&#xff0c;在循环所有的DataGrid1.Items的时候我们注意到&#xff0c;仅仅需要在ListItemType.Item和ListItemType.AlternatingItem中的第四列&#xff08;Cells[3]&#xff09;中的第一个按钮控件&#xff08;Controls[0]&#xff09;上添加属性&#xff0c;因为在DataGrid的Header或者Footer中是找不到这个删除按钮的&#xff08;虽然他们也是DataGrid1.Items&#xff09;。设想一下如果不写di.ItemType&#61;&#61;ListItemType.EditItem会怎么样&#xff1f;结果就是在编辑的时候按删除那个时候是没有提示的&#xff0c;因为没有给编辑的行的按钮加脚本。说到这里想说一下对这个程序的改进&#xff0c;大家或许不想在编辑的时候允许删除操作&#xff08;也就是点击了编辑按钮却没有点击取消或者更新按钮的时候是不运行删除操作&#xff09;&#xff0c;改进方法很简单&#xff1a;把e.CommandName&#61;&#61;"del"这个判断改为e.CommandName&#61;&#61;"del"&&e.Item.ItemType!&#61;ListItemType.EditItem&#xff0c;就可以达到这个目的了。
还有之所以在这里没有用((LinkButton)di.Cells[3].FindControl(删除按钮的id))来找到这个按钮是因为这个按钮如果不写是 不能添加id的&#xff0c;如果这个按钮是放在模板列中的&#xff0c;就可以有id了。
&#xff08;5&#xff09;
在编辑的时候
this.DataGrid1.EditItemIndex&#61;e.Item.ItemIndex在取消编辑的时候this.DataGrid1.EditItemIndex&#61;-1
当EditItemIndex!&#61;-1的时候&#xff0c;DataGrid显示的东西不再是ItemTemplate中的东西而是EditItemTemplate中的东西&#xff0c;所以在取消编辑的时候设定-1就可以了&#xff0c;同样EditItemIndex和ItemIndex差不多是从0开始编号&#xff0c;表示的是编辑的这一行的索引号。
&#xff08;6&#xff09;
foreach(DataGridItem di in this.DataGrid1.Items)
            {
                if(di.ItemType&#61;&#61;ListItemType.Item||di.ItemType&#61;&#61;ListItemType.AlternatingItem||di.ItemType&#61;&#61;ListItemType.EditItem)
                {
                    ((LinkButton)di.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm(&#39;delete?&#39;);");
                }
            }
        }
这段代码我为了演示如果不对ItemType进行判断会出错&#xff0c;所以对DataGrid1.Items进行了循环读取&#xff08;可以通过调试看到当在设置了Footer以后DataGrid1.Items.Count>PageSize&#xff09;&#xff0c;一般情况下这么写就可以了
if(e.Item.ItemType&#61;&#61;ListItemType.Item||e.Item.ItemType&#61;&#61;ListItemType.AlternatingItem||e.Item.ItemType&#61;&#61;ListItemType.EditItem)
    {
     ((LinkButton)e.Item.Cells[3].Controls[0]).Attributes.Add("onclick","return confirm(&#39;delete?&#39;);");
    }

暂时先说到这里&#xff0c;以后继续补充。




推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
author-avatar
芬妮199025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有