如何获取里面datagrid的按钮事件?

解决方案 »

  1.   

    在一个页面内并不好控制,建议使用web自定义控件
      

  2.   

    例子:
    首先是控件,这个web控件里面可以只放一个DataGrid,它的按钮事件就可以处理了:
    <%@ Control Language="c#" AutoEventWireup="false" Codebehind="ChildDataList.ascx.cs" Inherits="bsTest2005_8_16.Samples.ChildDataList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <asp:TextBox id="TextBox1" runat="server" Width="416px"></asp:TextBox>
    <asp:DataList ID="dlResourcesIn" runat="server" RepeatColumns="1" Width="100%">
    <ItemTemplate>
    <table width='100%' cellspacing='0' cellpadding='0' border='0'>
    <tr bgcolor="#ffffcc">
    <td width='40%' align="left" valign='middle'><%# DataBinder.Eval(Container.DataItem, "Datavalue")%></td>
    <td width='15%' align="center" valign='middle'><%# DataBinder.Eval(Container.DataItem, "LanguageName")%></td>
    <td width='15%' align="center" valign='middle'>
    <asp:LinkButton ID="Linkbutton3" runat="server" Text="<img src=../images/modify.gif border=0 alt='Edit'/>"
    CommandName="EDIT" CausesValidation="false"></asp:LinkButton>
    </td>
    <td width='15%' align="center" valign='middle'>
    <asp:LinkButton ID="Linkbutton4" runat="server" Text="<img src=../images/delete.gif border=0 alt='Delete'/>"
    CommandName="DEL" CausesValidation="false"></asp:LinkButton>
    </td>
    <td width='15%' align="center" valign='middle'>&nbsp;</td>
    </tr>
    </table>
    </ItemTemplate>
    </asp:DataList>
    namespace bsTest2005_8_16.Samples
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls; /// <summary>
    /// ChildDataList 的摘要说明。
    /// </summary>
    public class ChildDataList : System.Web.UI.UserControl
    {
            protected System.Web.UI.WebControls.TextBox TextBox1;
            protected System.Web.UI.WebControls.DataList dlResourcesIn; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    }        public void BindData(string curID)
            {
                DataTable dt1 = new DataTable();
                dt1.Columns.Add("id");
                dt1.Columns.Add("Datavalue");
                dt1.Columns.Add("LanguageName");
                
                dt1.Rows.Add(new object[]{curID,curID+"AAA","3t2342"});
                dt1.Rows.Add(new object[]{curID,curID+"BBB","23rs43342"});
                dt1.Rows.Add(new object[]{curID,curID+"CCC","325r342"});
                dt1.Rows.Add(new object[]{curID,curID+"AAA","nrds6y342"});            this.dlResourcesIn.DataSource = dt1;
                this.dlResourcesIn.DataBind();
            }        private void dlResourcesIn_ItemCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
            {
                if(e.CommandName == "EDIT")
                    this.TextBox1.Text = e.CommandName +"--"+ DateTime.Now.ToString();
                else if(e.CommandName == "DEL")
                    this.TextBox1.Text = e.CommandName +"--"+ DateTime.Now.ToString();
            } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
                this.dlResourcesIn.ItemCommand += new System.Web.UI.WebControls.DataListCommandEventHandler(this.dlResourcesIn_ItemCommand);
                this.Load += new System.EventHandler(this.Page_Load);        }
    #endregion }
    }
      

  3.   

    然后,主页面的DataGrid嵌套的是上面的web控件,
    <%@ Register TagPrefix="uc1" TagName="ChildDataList" Src="ChildDataList.ascx" %>
    <%@ Page language="c#" Codebehind="ChildDataList的父页面.aspx.cs" AutoEventWireup="false" Inherits="bsTest2005_8_16.Samples.ChildDataList的父页面" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>ChildDataList的父页面</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <asp:datalist id="dlResourcesOut" runat="server" Width="100%" RepeatColumns="1">
    <ItemTemplate>

    <TR>
    <TD class="tdrow1" valign="middle" align="left" width="40%"><%# DataBinder.Eval(Container.DataItem, "Datavalue")%></TD>
    <TD class="tdrow2" valign="middle" align="center" width="15%"><%# DataBinder.Eval(Container.DataItem, "LanguageName")%></TD>
    <TD class="tdrow1" valign="middle" align="center" width="15%">
    <asp:LinkButton id="Linkbutton1" runat="server" CausesValidation="false" CommandName="EDIT" Text="<img src=../images/modify.gif border=0 alt='Edit'/>"></asp:LinkButton></TD>
    <TD class="tdrow2" valign="middle" align="center" width="15%">
    <asp:LinkButton id="Linkbutton2" runat="server" CausesValidation="false" CommandName="DEL" Text="<img src=../images/delete.gif border=0 alt='Delete'/>"></asp:LinkButton></TD>
    <TD class="tdrow1" valign="middle" align="center" width="15%"><IMG style="CURSOR: hand" height="17" src="../images/p_down.gif" width="17">
    <uc1:ChildDataList id="ChildDataList1" runat="server"></uc1:ChildDataList></TD>
    </TR>
    <TR>
    <TD colspan="5"></TD>
    </TR>
    </ItemTemplate>
    </asp:datalist>
    </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 bsTest2005_8_16.Samples
    {
    /// <summary>
    /// ChildDataList的父页面 的摘要说明。
    /// </summary>
    public class ChildDataList的父页面 : System.Web.UI.Page
    {
            public System.Web.UI.WebControls.DataList dlResourcesOut;
        
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
                if(!IsPostBack) this.BindData();
    }        private void BindData()
            {
                DataTable dt1 = new DataTable();
                dt1.Columns.Add("id");
                dt1.Columns.Add("Datavalue");
                dt1.Columns.Add("LanguageName");
                
                dt1.Rows.Add(new object[]{111,"111","ASD"});
                dt1.Rows.Add(new object[]{222,"222","GEW"});
                dt1.Rows.Add(new object[]{333,"333","BER"});
                dt1.Rows.Add(new object[]{444,"444","NER"});            this.dlResourcesOut.DataSource = dt1;
                this.dlResourcesOut.DataBind();
            }        private void dlResourcesOut_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
            {
                if(e.Item.ItemIndex>-1)
                {
                    DataTable dt = this.dlResourcesOut.DataSource as DataTable;
                    ChildDataList tmp = e.Item.FindControl("ChildDataList1") as ChildDataList;
                    tmp.BindData(dt.Rows[e.Item.ItemIndex][0].ToString());
                }
            }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
                this.dlResourcesOut.ItemDataBound += new System.Web.UI.WebControls.DataListItemEventHandler(this.dlResourcesOut_ItemDataBound);
                this.Load += new System.EventHandler(this.Page_Load);        }
    #endregion       
    }
    }
      

  4.   

    并不会,lz可以把我上面的例子直接拷贝过去试一下就知道了如果有些内容,是需要控件内部保存起来的,可以存到ViewState
    例如上面例子中
    public void BindData(string curID)
    {
       //curID是从主页面传过来的“当前行id”,如果需要保存起来,则
       ViewState[this.CLientID + "_curID"] = curID;
    }
    也可以写成一个属性,那么从控件外部也可以随时设置或获取它的值
    public string CurID
    {
       get{return (ViewState[this.CLientID + "_curID"]==null )?string.Empty:ViewState[this.CLientID + "_curID"].ToString(); 
        }
       set
       {
          ViewState[this.CLientID + "_curID"] =value;
       }
    }
      

  5.   

    TO Eddie005(♂) 暴赱 『零零伍』(︶︵︶) 
    按照你的方法,我引用
    ProcessInfo ucPro = (ProcessInfo)e.Item.FindControl("ucPro");
    ProcessInfo是我的usercontrol的类名
    编译无法通过
    'ProcessInfo' is an ambiguous reference
      

  6.   

    1)控件先编译一下;
    2)using 控件所在的命名空间;
      

  7.   

    错误找到了,是namespace的问题
      

  8.   

    谢谢Eddie005(♂) 暴赱 『零零伍』(︶︵︶)