热门标签 | 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;以后继续补充。




推荐阅读
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • Vue 开发与调试工具指南
    本文介绍了如何使用 Vue 调试工具,包括克隆仓库、安装依赖包、构建项目以及在 Chrome 浏览器中加载扩展的详细步骤。 ... [详细]
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社区 版权所有