DataGrid的其中一列是个模板列,里面是checkbox,用于选定记录,然后点击删除按钮就可以删除了。
<asp:ButtonColumn Text="删除" HeaderText="删除" CommandName="Delete"></asp:ButtonColumn>
<asp:TemplateColumn HeaderText="选择">
<HeaderTemplate>
<input id="chkall" onClick="CheckAll(this.form)" type="checkbox" value="on" name="chkall">
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="selected" runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
具体问题是这样的:
1、如果DataGrid的EnableViewState设成false就能取到值,但这样DataGrid的分页等功能就不好使了.
2、如果DataGrid的EnableViewState设成true就取不到值,但这样DataGrid的分页等功能就好使了.我该怎么办.谁能告诉我DataGrid的EnableViewState设成true,为什么checkbox提交的值就是空的,原理是怎么回事,怎么解决。

解决方案 »

  1.   

    你是否没有if (!Page.IsPastback) ?
      

  2.   

    为DataGrid添加CheckBox控件
    VB.NET 版本CheckBoxDataGrid.aspx<%@ Page Language="vb" AutoEventWireup="false" Codebehind="CheckBoxDataGrid.aspx.vb"
     Inherits="aspxWeb.CheckBoxDataGrid" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
      <HEAD>
        <title>为DataGrid添加CheckBox控件的例子</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
        <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
        <meta name="vs_defaultClientScript" content="javascript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5";>
      </HEAD>
      <body MS_POSITIONING="GridLayout">
        <form id="frmMain" method="post" runat="server">
          <asp:DataGrid id="dgMain" runat="server" Width="98%" AutoGenerateColumns="False">
            <SelectedItemStyle Font-Size="9pt" Font-Names="宋体"></SelectedItemStyle>
            <EditItemStyle Font-Size="9pt" Font-Names="宋体" Font-Bold="True" ForeColor="Red" BackColor="Info"/>
            <AlternatingItemStyle Font-Size="9pt" Font-Names="宋体" ForeColor="ControlText" BackColor="White"/>
            <ItemStyle Font-Size="9pt" Font-Names="宋体" ForeColor="ControlText" BackColor="WhiteSmoke"/>
            <HeaderStyle Font-Bold="True" HorizontalAlign="Center" ForeColor="Black"
             VerticalAlign="Middle" BackColor="Control">
            </HeaderStyle>
            <Columns>
              <asp:TemplateColumn HeaderText="操作">
                <HeaderStyle HorizontalAlign="Center" Width="50px"></HeaderStyle>
                <ItemTemplate>
                  <asp:CheckBox ID="chkExport" Runat="server" />
                </ItemTemplate>
                <EditItemTemplate>
                  <asp:CheckBox ID="chkExportON" Runat="server" Enabled="true" />
                </EditItemTemplate>
              </asp:TemplateColumn>
              <asp:BoundColumn DataField="id" ReadOnly="True" HeaderText="序号">
                <HeaderStyle Width="50px"></HeaderStyle>
              </asp:BoundColumn>
              <asp:TemplateColumn SortExpression="demo" HeaderText="标题">
                <ItemTemplate>
                  <asp:Label Text='<%# Server.HTMLEncode(DataBinder.Eval(Container.DataItem, "Title"))%>'
                    runat="server" Width="80%" ID="lblColumn"/>
                </ItemTemplate>
              </asp:TemplateColumn>
            </Columns>
          </asp:DataGrid>
          <asp:Button id="cmdSelectAll" runat="server" Text="全部选中"></asp:Button>
          <asp:Button id="cmdFindSelected" runat="server" Text="查看选中的项目"></asp:Button>
          <br>
          <asp:Label id="Label1" runat="server"></asp:Label>
        </form>
      </body>
    </HTML>后代码 CheckBoxDataGrid.aspx.vbImports System.Data
    Imports System.Data.OleDbPublic Class CheckBoxDataGrid
      Inherits System.Web.UI.Page
      Protected WithEvents cmdSelectAll As System.Web.UI.WebControls.Button
      Protected WithEvents dgMain As System.Web.UI.WebControls.DataGrid
      Protected WithEvents cmdFindSelected As System.Web.UI.WebControls.Button  Dim oDataView As DataView
      Protected WithEvents Label1 As System.Web.UI.WebControls.Label
      Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="_
       + Server.MapPath("Test.mdb")
    #Region " Web Form Designer Generated Code "  'This call is required by the Web Form Designer.
      <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()  End Sub  Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs)_
       Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
      End Sub#End Region  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)_
       Handles MyBase.Load
        'Put user code to initialize the page here
        dgMain.Columns(0).HeaderText = "选项"
        dgMain.Columns(1).HeaderText = "序号"
        dgMain.Columns(2).HeaderText = "标题"
        cmdFindSelected.Text = "查看选中的项目"
        RefreshGrid()
        If Not Page.IsPostBack Then
          cmdSelectAll.Text = "全部选中"
          dgMain.DataBind()
        End If  End Sub
    #Region "处理多选"
      Private Sub cmdSelectAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
       Handles cmdSelectAll.Click
        selectAll()
      End Sub  Private Sub selectAll()
        Dim oDataGridItem As DataGridItem
        Dim chkExport As System.Web.UI.WebControls.CheckBox    If cmdSelectAll.Text = "全部选中" Then
          For Each oDataGridItem In dgMain.Items
            chkExport = oDataGridItem.FindControl("chkExport")
            chkExport.Checked = True
          Next
          cmdSelectAll.Text = "全部不选"
        Else
          For Each oDataGridItem In dgMain.Items
            chkExport = oDataGridItem.FindControl("chkExport")
            chkExport.Checked = False
          Next
          cmdSelectAll.Text = "全部选中"
        End If
      End Sub
    #End Region#Region "更新DataGrid"  Private Sub RefreshGrid()
        Dim oConnection As OleDbConnection
        Dim oCommand As OleDbDataAdapter
        Dim oDataSet As New DataSet()    Try
          Dim sSQL As String = "Select top 5 * from TestTable order by id"
          oConnection = New OleDbConnection(sConnectionString)
          oCommand = New OleDbDataAdapter(sSQL.ToString, oConnection)
          oCommand.Fill(oDataSet, "TestTable")
          oDataView = New DataView(oDataSet.Tables("TestTable"))
          dgMain.DataSource = oDataView
          oConnection.Close()    Catch ex As Exception
          '// Place Error Handling here
        End Try
      End Sub
    #End Region  Private Sub cmdFindSelected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
       Handles cmdFindSelected.Click
        Dim oDataGridItem As DataGridItem
        Dim chkExport As System.Web.UI.WebControls.CheckBox
        Dim oExArgs As New System.Collections.ArrayList()
        Dim sID As String
        Label1.Text = ""
        For Each oDataGridItem In dgMain.Items
          chkExport = oDataGridItem.FindControl("chkExport")
          If chkExport.Checked Then
            Label1.Text = ""
            sID = CType(oDataGridItem.FindControl("lblColumn"), Label).Text
            oExArgs.Add(sID)
            Dim i As Integer = 0
            For i = 0 To oExArgs.Count - 1
              Label1.Text += oExArgs(i) + ","
            Next
          End If
        Next
      End SubEnd Class
      

  3.   

    C# 版本CheckBoxDataGrid.aspx<%@ Page language="c#" enableViewState = "true" Codebehind="DataGridCheckBox.aspx.cs"
    AutoEventWireup="false" Inherits="eMeng.Exam.DataGridCheckBox.DataGridCheckBox" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <title>为DataGrid添加CheckBox控件的例子</title>
    </HEAD>
    <body>
    <form id="frmMain" method="post" runat="server">
    <asp:DataGrid id="dgMain" runat="server" Width="98%" AutoGenerateColumns="False" Font-Size="9pt" Font-Names="宋体">
     <AlternatingItemStyle ForeColor="ControlText" BackColor="White" />
     <ItemStyle ForeColor="ControlText" BackColor="WhiteSmoke" />
     <HeaderStyle Font-Bold="True" HorizontalAlign="Center" ForeColor="Black" VerticalAlign="Middle"
      BackColor="Control"></HeaderStyle>
     <Columns>
      <asp:TemplateColumn HeaderText="操作">
       <HeaderStyle HorizontalAlign="Center" Width="50px"></HeaderStyle>
       <ItemTemplate>
        <input type="hidden" id="SelectedID" runat="server" 
        value='<%# DataBinder.Eval(Container.DataItem, "id")%>'/>
        <asp:CheckBox ID="chkExport" Runat="server" />
       </ItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="id" ReadOnly="True" HeaderText="序号">
       <HeaderStyle Width="50px"></HeaderStyle>
      </asp:BoundColumn>
      <asp:TemplateColumn SortExpression="demo" HeaderText="标题">
       <ItemTemplate>
        <asp:Label Text='<%# Server.HtmlEncode((string)DataBinder.Eval(Container.DataItem, "Title"))%>'
         runat="server" Width="80%" ID="lblColumn" />
       </ItemTemplate>
      </asp:TemplateColumn>
     </Columns>
    </asp:DataGrid>
    <asp:Button id="cmdSelectAll" runat="server" Text="全部选中"></asp:Button>
    <asp:Button id="cmdFindSelected" runat="server" Text="查看选中的项目"></asp:Button>
    <br>
    <asp:Label id="Label1" runat="server"></asp:Label>
    <hr>
    <asp:Label id="Label2" runat="server"></asp:Label>
    </form>
    </body>
    </HTML>DataGridCheckBox.aspx.csusing System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    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 eMeng.Exam.DataGridCheckBox
    {
     /// <summary>
     /// DataGridCheckBox 的摘要说明。
     /// 【孟宪会之精彩世界】
     /// </summary>
     public class DataGridCheckBox : System.Web.UI.Page
     {
      protected System.Web.UI.WebControls.Button cmdSelectAll;
      protected System.Web.UI.WebControls.Button cmdFindSelected;
      protected System.Web.UI.WebControls.DataGrid dgMain;
      protected System.Web.UI.WebControls.Label Label1;
      protected System.Web.UI.WebControls.Label Label2;
      DataView oDataView;
      string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
      + HttpContext.Current.Server.MapPath("../../aspxWeb.mdb.ascx");
     
      private void Page_Load(object sender, System.EventArgs e)
      {
       // 在此处放置用户代码以初始化页面
       dgMain.Columns[0].HeaderText = "选项";
       dgMain.Columns[1].HeaderText = "序号";
       dgMain.Columns[2].HeaderText = "标题";
       cmdFindSelected.Text = "查看选中的项目";
       RefreshGrid();
       if( !this.IsPostBack)
       {
        cmdSelectAll.Text = "全部选中";
        dgMain.DataBind();
       }
      }
     #region Web Form Designer generated code
     override protected void OnInit(EventArgs e)
     {
      //
      // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
      //
      InitializeComponent();
      base.OnInit(e);
     } /// <summary>
     /// 设计器支持所需的方法 - 不要使用代码编辑器修改
     /// 此方法的内容。
     /// </summary>
     private void InitializeComponent()
     {    
      this.cmdSelectAll.Click += new System.EventHandler(this.cmdSelectAll_Click);
      this.cmdFindSelected.Click += new System.EventHandler(this.cmdFindSelected_Click);
      this.Load += new System.EventHandler(this.Page_Load); }
     #endregion  private void cmdSelectAll_Click(object sender, System.EventArgs e)
      {
       selectAll();
      }  private void selectAll()
      {
       System.Web.UI.WebControls.CheckBox chkExport ;
       if( cmdSelectAll.Text == "全部选中")
       {
        foreach(DataGridItem oDataGridItem in dgMain.Items)
        {
         chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
         chkExport.Checked = true;
        }
        cmdSelectAll.Text = "全部不选";
       }
       else
       {
        foreach(DataGridItem oDataGridItem in dgMain.Items)
        {
         chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
         chkExport.Checked = false;
        }
        cmdSelectAll.Text = "全部选中";
       }
      }  private void RefreshGrid()
      {
       OleDbConnection oConnection;
       OleDbDataAdapter oCommand ;
       DataSet oDataSet = new DataSet();
       try
       {
        string sSQL = "Select top 10 * from Document order by CreateDate DESC";
        oConnection = new OleDbConnection(sConnectionString);
        oCommand = new OleDbDataAdapter(sSQL.ToString(), oConnection);
        oCommand.Fill(oDataSet, "Document");
        oDataView = new DataView(oDataSet.Tables["Document"]);
        dgMain.DataSource = oDataView;
        oConnection.Close();
       }
       catch(Exception ex)
       {
        Label1.Text = ex.Message.ToString();
       }
      }  private void cmdFindSelected_Click(object sender, System.EventArgs e)
      {
       System.Web.UI.WebControls.CheckBox chkExport;
       System.Collections.ArrayList oExArgs = new System.Collections.ArrayList();
       string sID;
       Label1.Text = "";
       Label2.Text = "";
       foreach(DataGridItem oDataGridItem in dgMain.Items)
       {
          chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
          if( chkExport.Checked)
          {
             //如果要进行删除,可以在这里构造sql语句进行删除
             string sql = "DELETE FROM Document WHERE id =" 
                + ((HtmlInputHidden)oDataGridItem.FindControl("SelectedID")).value;
             Label2.Text += "<li>" + sql; 
             sID = ((HtmlInputHidden)oDataGridItem.FindControl("SelectedID")).value;
             oExArgs.Add(sID);
             int i = 0;
             Label1.Text = "";
             for( i = 0;i<oExArgs.Count;i++)
             {
                Label1.Text += oExArgs[i] + "<br>";
             }
          }
       }
       Label2.Text += "<br><font color=red>执行SQL语句即可删除,这里省略。</font>";
      }
     }
    }
      

  4.   

    绑定表格的事件一定没有在if(!IsPostBack)里
    提交时页面刷新,所以你取到的都是默认的false
      

  5.   

    绑定表格的事件一定没有在if(!IsPostBack)里
    确实没有在if(!IsPostBack)里,但如果在if(!IsPostBack)里
    提交后就变成白板了。
      

  6.   

    绑定时一定要在if(!IsPostBack)
    {}
    中。
    要不一提交就会重新绑定,原来的状态就没有了。你自然就取不到值了。
      

  7.   

    -------
    如果在if(!IsPostBack)里
    提交后就变成白板了。
    _______
    datagrid 变成,怎么可能?
      

  8.   

    当我把绑定表格的事件一定没有在if(!IsPostBack)里
    点击checkbox列左边的删除那一列的删除链接时,页面就出现白板。
    (注:我的删除有两种方式一种是选择了checkbox列的checkbox,按删除按钮。
    另一种是点击checkbox列左侧的删除列里的删除链接。)
      

  9.   

    ————————
    当我把绑定表格的事件一定没有在if(!IsPostBack)里
    点击checkbox列左边的删除那一列的删除链接时,页面就出现白板。
    ————————
    删除后重新绑定datagrid,将EnableViewState设成true
      

  10.   

    看来我是没搞清楚原理,不过viewstate这块真是不好懂。
    我也看了一些资料。
    不过还是不能深刻理解if(!IsPostBack)的作用,和ViewState对提交的影响。
    另外,!IsPostBack和!this.IsPostBack和!Page.IsPostBack是一回事吗。我自己也在调试中,不过不太方便。能不能重新编译后保持session和application等状态阿。
    不然我感觉真是不方便,对用户影响太大。
      

  11.   

    -----
    重新编译后保持session和application等状态
    ——————
    不可能的,重新生成dll,session失效
      

  12.   

    解决方法:
    EnableViewState设成true 为了确保分页好用
    数据绑定放置在Page.IsPostBack中
    每次分页的时候会重新绑定数据,这样选择的checkbox就会被清空,
    所以重新绑定之前要先保存checkbox的状态,重新绑定之后再设置一下
      

  13.   

    重新绑定之后再设置一下?????
    取都取不到值,怎么再设置。checkbox的值true和false,是用户点击的。
    谁能帮我取到它的值。并说明原因。
      

  14.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    checksession();
    //if(!Page.IsPostBack)
    //{
    this.sqlDataAdapter1.Fill(this.dataSet21);
    this.DataGrid1.DataBind();
    //}
    }
    private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    this.sqlConnection1.Open();
    int keyID = Convert.ToInt32(this.DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString());
    this.sqlDeleteCommand1.Parameters["@Original_question_ID"].Value = keyID; //取得选中的行

    this.sqlDeleteCommand1.ExecuteNonQuery(); //执行删除
    this.dataSet21 = new DataSet2();//用新的数据集
    this.sqlDataAdapter1.Fill(this.dataSet21);
    this.DataGrid1.DataBind(); //重新绑定
    this.sqlConnection1.Close();
    }
    private void btndel_ServerClick(object sender, System.EventArgs e)
    {
    string mystr = "";
    foreach(DataGridItem myit in this.DataGrid1.Items)
    {
    CheckBox mychk = myit.Cells[4].FindControl("selected") as CheckBox;  //Cells[0]表示checkbox是放在第1列里的,根据你自己的情况改
    if(mychk!=null && mychk.Checked==true)
    mystr += this.DataGrid1.DataKeys[myit.ItemIndex].ToString()+",";
    }
    if(mystr!="")
    {
    mystr = mystr.Substring(0,mystr.LastIndexOf(","));//删除最后一个","
    }
    string strSql="delete from T_question where question_ID in("+mystr+")";
    this.sqlConnection1.Open();
    SqlCommand sqlDeleteCommand2 = new System.Data.SqlClient.SqlCommand();
    sqlDeleteCommand2.Connection = this.sqlConnection1;
    sqlDeleteCommand2.CommandText=strSql; //取得选中的行
    sqlDeleteCommand2.ExecuteNonQuery(); //执行删除
    this.dataSet21 = new DataSet2();
    this.sqlDataAdapter1.Fill(this.dataSet21);
    this.DataGrid1.DataBind(); //重新绑定
    this.sqlConnection1.Close();
    }
      

  15.   

    http://blog.csdn.net/jaguar1982/archive/2005/01/25/267394.aspx
    MSDN WebCast 讲座下载(Datagrid高级使用技巧)
      

  16.   

    问题还没解决.
    现在是如果datagrid的viewstate是true,则btndel_ServerClick中取到的checkbox状态是空值,
    如果datagrid的viewstate是false,则在btndel_ServerClick中取到的才有值。为什么,怎么解决。
    实践证明,if (!Page.IsPastback)不能解决问题。
      

  17.   

    我也遇到这个问题,现在解决了,拿出来给大家分享!1,首先,添加一个隐藏的控件,存储选中CheckBox的ID号。
       <INPUT id="LA_select" type="hidden" name="LA_select" runat="server">2,把DataGrid中的CheckBox改成如下形式:
       <input type="checkbox" runat="server" id="CB_select" 
       onclick="javascript:CBclick(this)" 
       value='<%#DataBinder.Eval(Container.DataItem,"ID")%>' />3,编写Jscript:
       function CBclick(cb)
       {
             var lab = document.getElementById("LA_select");
    if( cb.checked )
             lab.value += "," + cb.value;
    else
    lab.value = lab.value.replace( ","+cb.value , "");
        }4,在激发按钮事件中取得隐藏控件的Value值,分析出所选的ID号。
        string[] ids = LA_select.Value.Split( ',');呵呵,孟子教我的。在此谢谢他。