一个只读列、绑定列、模板列(动态下拉)、编辑列都有的DataGrid

来源:互联网 发布:java 参数 notnull 编辑:程序博客网 时间:2024/04/29 23:06

一、页面
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WelShem.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
    <title>WebForm12</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
  </HEAD>
  <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
      <table align="center" width="500">
        <tr>
          <td></td>
        </tr>
        <tr>
          <td>
            <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" Width="495px">
              <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
              <Columns>
                <!-- 只读绑定列,用于实现在编辑状态下不允许改动的数据(正式使用时先删除) -->
                <asp:BoundColumn DataField="AffairID" ReadOnly="True" HeaderText="编号"/>
                <!-- 常规绑定列,在编辑状态下显示为文本框(正式使用时先删除) -->
                <asp:BoundColumn DataField="AffairContent" HeaderText="内容"/>
                <!-- 只读隐藏绑定列,隐藏下拉列表中原始的数据(正式使用时先删除) -->
                <asp:BoundColumn Visible="False" DataField="AffairState" ReadOnly="True" HeaderText="状态"/>
                <!-- 模板列,用于实现在编辑状态下非文本框的其他编辑域(正式使用时先删除) -->
                <asp:TemplateColumn HeaderText="状态">
                  <!-- 常态模板,非编辑状态下呈现的样子(正式使用时先删除) -->
                  <ItemTemplate>
                    <asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.AffairState") %>' />
                  </ItemTemplate>
                  <!-- 编辑态模板,编辑状态下呈现的样子(正式使用时先删除) -->
                  <EditItemTemplate>
                    <!-- 下拉列表,动态绑定(正式使用时先删除) -->
                    <asp:DropDownList id="cboState" runat="server" Width="100px" />
                  </EditItemTemplate>
                </asp:TemplateColumn>
                <!-- 编辑按钮列(正式使用时先删除) -->
                <asp:EditCommandColumn ButtonType="PushButton" UpdateText="更新" CancelText="取消" EditText="编辑">
                  <ItemStyle HorizontalAlign="Center"></ItemStyle>
                </asp:EditCommandColumn>
              </Columns>
            </asp:DataGrid></td>
        </tr>
      </table>
    </form>
  </body>
</HTML>

二、代码

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
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 WelShem
{
  /// <summary>
  /// WebForm1 的摘要说明。
  /// </summary>

  public class WebForm1 : System.Web.UI.Page
  {
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
 
    private void Page_Load(object sender, System.EventArgs e)
    {
      if(!this.IsPostBack)
      {
        this.Bind();
      }
    }
    /*
      为了直接可试用,没有基于数据库。使用的是动态生成并用ViewState维持的数据
      在实际使用时可改成从数据库中通过ADO.net获取
    */
    private DataTable GetData()
    {
      if(!this.IsPostBack)
      {
        DataTable dt=new DataTable();
        dt.Columns.Add("AffairID",typeof(String));
        dt.Columns.Add("AffairContent",typeof(String));
        dt.Columns.Add("AffairState",typeof(String));
        for(int i=1;i<10;i++)
        {
          dt.Rows.Add(new object[]{"000"+i.ToString(),"待填事务","准备"});
        }
        this.ViewState["dt"]=dt;
      }
      return (DataTable)this.ViewState["dt"];
    }
    private void Bind()
    {
      DataTable dt=this.GetData();
      dt.DefaultView.Sort=dt.Columns[0].ColumnName;
      this.DataGrid1.DataSource=dt.DefaultView;
      this.DataGrid1.DataBind();
    }

    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
      //
      // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
      //
      InitializeComponent();
      base.OnInit(e);
    }
   
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>

    private void InitializeComponent()
    {   
      this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_CancelCommand);
      this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCommand);
      this.DataGrid1.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_UpdateCommand);
      this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
      this.Load += new System.EventHandler(this.Page_Load);

    }
    #endregion

    private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      this.DataGrid1.EditItemIndex=-1;
      this.Bind();
    }

    private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      this.DataGrid1.EditItemIndex=e.Item.ItemIndex;
      this.Bind();
      /*
        控制第二列编辑项的列宽
        由于已重新绑定,而e.Item还指向原位置,在定位时不能再用e,Item
      */

      ((TextBox)this.DataGrid1.Items[e.Item.ItemIndex].Cells[1].Controls[0]).Width=80;
    }

    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      /*
        只读列,可直接从对应单元格中取文本
        格式:e.Item.Cells[i].Text      i为列号
      */
      string aID=e.Item.Cells[0].Text;
      /*
        常规绑定列,呈现的是文本框所以要从控件中取值
        格式:((TextBox)e.Item.Cells[i].Controls[0]).Text      i为列号
      */
      string aContent=((TextBox)e.Item.Cells[1].Controls[0]).Text;
      /*
        模板列有中种模板,编辑时使用三种:标题模板、编辑模板、底边模板
        要取的值在第二个控件中
        格式:((编辑控件类型)e.Item.Cells[i].Controls[1]).对应属性      i为列号
      */
      string aState=((DropDownList)e.Item.Cells[3].Controls[1]).SelectedItem.Text;

      /*
        修改数据库
      */
      DataTable dt=(DataTable)this.ViewState["dt"];
      dt.DefaultView.RowFilter="AffairID="+e.Item.Cells[0].Text;
      if(dt.DefaultView.Count>0)
        dt.DefaultView.Delete(0);
      dt.DefaultView.RowFilter="";

      dt.Rows.Add(new object[]{aID,aContent,aState});

      this.DataGrid1.EditItemIndex=-1;
      this.Bind();
    }

    private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
      if(e.Item.ItemType==ListItemType.EditItem)
      {
        ArrayList ay=new ArrayList();
        ay.Add("准备");
        ay.Add("启动");
        ay.Add("进行中");
        ay.Add("完工");
        DropDownList cboList=(DropDownList)e.Item.Cells[3].Controls[1];
        cboList.DataSource=ay;
        cboList.DataBind();
        cboList.Items.FindByText(e.Item.Cells[2].Text).Selected=true;
      }
    }
  }
}