NamingContainer
使用時機: 譬如 GridView裏的TemplateField 放了1個TextBox,1個CheckBox(設定AutoPostBack = "true")
畫面上的GridView假設有5筆資料,當其中一筆的CheckBox的事件CheckedChanged觸發時,可以藉由事件的參數 object sender,找到他是畫面上的哪一列,及該列的其它控制項。

aspx

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

<!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>Untitled Page</title>
</head>
<body>
 <form id="form1" runat="server">
  <div>
   <asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false" OnRowDataBound="gridView_RowDataBound">
    <Columns>
     <asp:TemplateField>
      <HeaderTemplate>
       ID:
      </HeaderTemplate>
      <ItemTemplate>
       <asp:Literal ID="litID" runat="server" Text='<%#Eval("ID") %>' />
      </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField>
      <HeaderTemplate>
       姓名:
      </HeaderTemplate>
      <ItemTemplate>
       <asp:TextBox ID="txtName" runat="server" Text='<%#Eval("Name") %>'></asp:TextBox>
      </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField>
      <HeaderTemplate>
       在職:
      </HeaderTemplate>
      <ItemTemplate>
       <asp:CheckBox ID="chkWorking" runat="server" AutoPostBack="true" OnCheckedChanged="chkWorking_CheckedChanged" />
      </ItemTemplate>
     </asp:TemplateField>
    </Columns>
   </asp:GridView>
  </div>
 </form>
</body>
</html>

aspx.cs

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class PageDefault : System.Web.UI.Page {
    private ArrayList EmployeeList;
    protected void Page_Load(object sender, EventArgs e) {
        if (IsPostBack == false) {
            EmployeeList = new ArrayList();
            EmployeeList.Add(new Employee(1, "john", true));
            EmployeeList.Add(new Employee(2, "may", false));
            EmployeeList.Add(new Employee(3, "momo", true));
            EmployeeList.Add(new Employee(4, "dennis", false));
            EmployeeList.Add(new Employee(5, "esp", true));
            gridView.DataSource = EmployeeList;
            gridView.DataBind();
        }
    }

    protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e) {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            Employee employee = (Employee)e.Row.DataItem;
            CheckBox chkWorking = (CheckBox)e.Row.FindControl("chkWorking");
            chkWorking.Checked = employee.Working;
        }
    }

    protected void chkWorking_CheckedChanged(object sender, EventArgs e) {       
        CheckBox chkWorking = (CheckBox)sender;       
        GridViewRow row = chkWorking.NamingContainer as GridViewRow;
        TextBox txtName = row.FindControl("txtName") as TextBox;
        Literal litID = row.FindControl("litID") as Literal;
        string action = chkWorking.Checked ? "勾選" : "取消";
        Response.Write(String.Format("{0}: {1}({2}) <br />", action, txtName.Text, litID.Text));       
    }

    public class Employee {
        private int m_id;
        private string m_name;
        private bool m_working;

        public Employee(int id, string name, bool working) {
            this.ID = id;
            this.Name = name;
            this.Working = working;
        }

        public int ID {
            get { return m_id; }
            set { m_id = value; }
        }

        public string Name {
            get { return m_name; }
            set { m_name = value; }
        }

        public bool Working {
            get { return m_working; }
            set { m_working = value; }
        }

    }
}

arrow
arrow
    全站熱搜

    alen1985 發表在 痞客邦 留言(0) 人氣()