GridView+checkbox的问题

a377493206 2009-04-19 08:03:25
//删除
protected void Button5_Click(object sender, EventArgs e)
{
try
{
int count = this.GridView1.Rows.Count;
for (int i = 0; i < count; i++)
{
CheckBox chk =(CheckBox)this.GridView1.Rows[i].FindControl("Itemchk");

if (chk.Checked)
{
int id = Convert.ToInt32(this.GridView1.Rows[i].Cells[0].Text);
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["meetingConn"].ConnectionString);
conn.Open();
string sqlstr = "delete from meetroom where id='"+id+"'";
SqlCommand cmd = new SqlCommand(sqlstr,conn);
cmd.ExecuteNonQuery();
conn.Close();
Response.Write("<script>alert('删除成功');</script>");
}
this.DataBindMeetroom();
}
}
catch
{ Response.Write("<script>alert('服务器忙,请一会再试');</script>");}

上面是删除按钮的代码。

这是前台的代码:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="EditRoom.aspx.cs" Inherits="EditRoom" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<table style="width: 491px; height: 87px;">
<tr>
<td align="center" style="width: 563px; color: white; background-color: #0066ff; height: 1px;">
会议室管理--管理会议室</td>
</tr>
<tr>
<td style="width: 563px; height: 98px;" align="center">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCreated="Gv_RowCreated" Width="538px" Height="136px" CellPadding="4">
<Columns>
<asp:BoundField DataField="id" HeaderText="编号" ReadOnly="True"/>
<asp:BoundField DataField="roomname" HeaderText="会议室名称" ReadOnly="True" />
<asp:BoundField DataField="roomaddr" HeaderText="会议室地点" ReadOnly="True" />
<asp:BoundField DataField="roomcount" HeaderText="可容纳人数" ReadOnly="True" />
<asp:TemplateField>
<HeaderTemplate>
编辑
</HeaderTemplate>
<ItemTemplate>
<a href="ChangeRoom.aspx?id=<%#DataBinder.Eval(Container.DataItem,"id") %>">编辑</a>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="Itemchk" runat="server"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle BackColor="White" />
<PagerStyle BackColor="White" />
<HeaderStyle BackColor="SkyBlue" />
</asp:GridView>
</td>
</tr>
<tr>
<td style="width: 563px">
共有<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>条记录,当前是第<asp:Label
ID="Label2" runat="server" Text="1" Width="15px"></asp:Label>/<asp:Label ID="Label3" runat="server"
Text="Label"></asp:Label>页<asp:Button ID="Button1" runat="server" Text="首页" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="上页" OnClick="Button2_Click" />
<asp:Button ID="Button3" runat="server" Text="下页" OnClick="Button3_Click" />
<asp:Button ID="Button4" runat="server" Text="末页" OnClick="Button4_Click" /></td>
</tr>
<tr>
<td style="width: 563px; height: 20px;">
       <asp:CheckBox
ID="CheckBox1" runat="server" Text="全选" Height="22px" AutoPostBack="true" OnCheckedChanged="CheckBox1_CheckedChanged" Width="54px" />
 
<asp:Button ID="Button5" runat="server" Text="删除选定项" OnClick="Button5_Click" /></td>
</tr>
</table>
</asp:Content>

每次一点击删除按钮的时候,CheckBox选定的项自动取消选定的,而且删除时间也没有执行,可是
去掉 if (chk.Checked)这句以后,可以执行删除,但是第一次执行时,删除了所有的id为基数的项,以后在执行的时候则按顺序一条一条的执行。
...全文
1414 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DOLPHIN_play_87806 2009-07-15
  • 打赏
  • 举报
回复
又学到很多东西,真好
lanshuye54 2009-05-06
  • 打赏
  • 举报
回复
if(chk.Checked==true)
你试着将上面的if语句修改一下
Jock.Chen 2009-04-20
  • 打赏
  • 举报
回复
后台代码:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public partial class EditRoom : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 全选
CheckBox1.Attributes.Add("onclick", "chkSelectAll(this);");
// 加载数据
LoadData();
}
}

private void LoadData()
{
GridView1.DataSource = GetDataList();
GridView1.DataBind();
}


/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
private DataTable GetDataList()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["meetingConn"].ConnectionString;
con.Open();
string sqlSelect = "Select * From meetroom";
SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}

private static string msg = "<script>alert('{0}');</script>";

/// <summary>
/// 提示信息
/// </summary>
/// <param name="strMsg"></param>
private void MessageShow(string strMsg)
{
Response.Write(string.Format(msg, strMsg));
}

/// <summary>
/// 删除选择记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button5_Click(object sender, EventArgs e)
{
if (hidSelectId.Value.Length == 0)
{
MessageShow("请选择要删除的记录.");
return;
}
try
{
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["meetingConn"].ConnectionString;
con.Open();
string sqlDelete = string.Format("Delete From meetroom where id in ({0})", hidSelectId.Value.TrimEnd(','));
SqlCommand cmd = new SqlCommand(sqlDelete);
cmd.Connection = con;
cmd.ExecuteNonQuery();
// 重新加载数据
LoadData();
MessageShow("删除成功.");
}
catch(Exception ex)
{
MessageShow(ex.Message);
}
}

protected void Gv_RowCreated(object sender, GridViewRowEventArgs e)
{
//
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// 单条记录选择
CheckBox chkSelect = e.Row.FindControl("Itemchk") as CheckBox;
DataRowView drv = e.Row.DataItem as DataRowView;
string id = drv["Id"].ToString();
chkSelect.Attributes.Add("onclick", string.Format("setSelectVal(this,'{0}');", id));
}
}
protected void Button1_Click(object sender, EventArgs e)
{

}
protected void Button2_Click(object sender, EventArgs e)
{

}
protected void Button3_Click(object sender, EventArgs e)
{

}
protected void Button4_Click(object sender, EventArgs e)
{

}
}

Jock.Chen 2009-04-20
  • 打赏
  • 举报
回复
思路:通过javascript控制选择,将选择的记录放在一个hidden类型的input中.删除时用Delete From meetroom where id in ({0}) 语句. 下面代码测试通过.


use office
go
create table meetroom (id int identity(1,1),roomname nvarchar(20),roomaddr nvarchar(30),roomcount int)
go

insert into meetroom
select '计算机2000-1班' as roomname,'教研楼A栋301室' as roomaddr,30 as roomcount
union
select '计算机2000-2班' as roomname,'教研楼A栋302室' as roomaddr,35 as roomcount
union
select '计算机2000-3班' as roomname,'教研楼A栋303室' as roomaddr,40 as roomcount



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EditRoom.aspx.cs" Inherits="EditRoom" %>

<!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">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript">
var hidCtlId = "<%=hidSelectId.ClientID%>";

function checkSelectId() {

var hidValId = document.getElementById(hidCtlId);
if (hidValId.value.length == 0) {
alert("请先选择要操作的数据");
return false;
}
return true;
}

function chkSelectAll(spanckb) {
var thebox = spanckb;
oState = thebox.checked;

oItem = document.getElementsByTagName("input");

for (i = 0; i < oItem.length; i++) {
if (oItem[i].type == "checkbox" & oItem[i].id != thebox.id) {
if (oItem[i].checked != oState)
oItem[i].click();
}
}
}

function setSelectVal(spanckb, id) {
var thebox = spanckb;
oState = thebox.checked;
if (oState) {
attachVal(id);
}
else {
detachVal(id);
}
}

function attachVal(id) {
var hidValId = document.getElementById(hidCtlId);
var selValue = ',' + hidValId.value;
temp = ',' + id + ',';
// 不存在则添加
if (selValue.indexOf(temp) == -1) {
hidValId.value = hidValId.value + id + ',';
}
}

function detachVal(id) {
var hidValId = document.getElementById(hidCtlId);
var selValue = ',' + hidValId.value;
temp = ',' + id + ',';
selValue = selValue.replace(temp, ',');
hidValId.value = selValue.substr(1);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 491px; height: 87px;">
<tr>
<td align="center" style="width: 563px; color: white; background-color: #0066ff; height: 1px;">
会议室管理--管理会议室 </td>
</tr>
<tr>
<td style="width: 563px; height: 98px;" align="center">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
OnRowCreated="Gv_RowCreated" Width="538px" Height="136px" CellPadding="4"
onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="id" HeaderText="编号" ReadOnly="True"/>
<asp:BoundField DataField="roomname" HeaderText="会议室名称" ReadOnly="True" />
<asp:BoundField DataField="roomaddr" HeaderText="会议室地点" ReadOnly="True" />
<asp:BoundField DataField="roomcount" HeaderText="可容纳人数" ReadOnly="True" />
<asp:TemplateField>
<HeaderTemplate>
编辑
</HeaderTemplate>
<ItemTemplate>
<a href="ChangeRoom.aspx?id= <%#DataBinder.Eval(Container.DataItem,"id") %>">编辑 </a>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="Itemchk" runat="server"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle BackColor="White" />
<PagerStyle BackColor="White" />
<HeaderStyle BackColor="SkyBlue" />
</asp:GridView>
</td>
</tr>
<tr>
<td style="width: 563px">
共有 <asp:Label ID="Label1" runat="server" Text="Label"> </asp:Label>条记录,当前是第 <asp:Label
ID="Label2" runat="server" Text="1" Width="15px"> </asp:Label>/ <asp:Label ID="Label3" runat="server"
Text="Label"> </asp:Label>页 <asp:Button ID="Button1" runat="server" Text="首页" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="上页" OnClick="Button2_Click" />
<asp:Button ID="Button3" runat="server" Text="下页" OnClick="Button3_Click" />
<asp:Button ID="Button4" runat="server" Text="末页" OnClick="Button4_Click" /> </td>
</tr>
<tr>
<td style="width: 563px; height: 20px;">
<input id="hidSelectId" runat="server" type="hidden" />
        <asp:CheckBox
ID="CheckBox1" runat="server" Text="全选" Height="22px" Width="54px" />
 
<asp:Button ID="Button5" runat="server" Text="删除选定项" OnClick="Button5_Click" /> </td>
</tr>
</table>

</div>
</form>
</body>
</html>

皓月明 2009-04-20
  • 打赏
  • 举报
回复
我同意楼上的
wh110 2009-04-20
  • 打赏
  • 举报
回复
this.DataBindMeetroom();这个事件移出FOR循环外,而且你这样的写法,在同时删除两条或两条以上记录的时候,你会发现你那个弹出消息就根据你删除的数据条数而弹出多少次。
whitebo 2009-04-20
  • 打赏
  • 举报
回复
this.DataBindMeetroom(); 移到for外面试下
a377493206 2009-04-19
  • 打赏
  • 举报
回复
不来解决问题的不要乱叫!
netlangzi 2009-04-19
  • 打赏
  • 举报
回复
帮顶一下

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧