1

我有一个带有简单嵌套中继器的项目。当我单击按钮时,不会调用 OnItemCommand 事件,但会调用 OnItemCreated(但是,它不会调用 Page_Load 事件处理程序)。我错过了什么?

标记

  <table width="100%">
    <tr>
        <td>my row</td>
        <td>my description</td>
    </tr>
    <asp:Repeater ID="rptMain" runat="server" OnItemCreated="rptMain_ItemCreated" OnItemCommand="rptMain_ItemCommand">
        <ItemTemplate>
        <tr style="background-color:#45abdc;">
            <td><asp:LinkButton ID="ibtnDoSomething" runat="server" CommandArgument="SELECT" Text="Clicky" /></td>
            <td><asp:Label ID="lblMainData" runat="server"></asp:Label></td>

        </tr>
        <asp:Repeater ID="rptChild" runat="server" OnItemCreated="rptChild_ItemCreated">
            <ItemTemplate>
                <tr style="background-color:#bcbbcb;">
                    <td>

                    </td>
                    <td>
                        <asp:Label ID="lblChildData" runat="server"></asp:Label>
                    </td>

                </tr>

            </ItemTemplate>
        </asp:Repeater>
        </ItemTemplate>
    </asp:Repeater>

   </table>

CODEBEHIND DataTable _childdata = new DataTable(); 数据表 _data = 新数据表();

        public void Page_Load()
        {

            _data.Columns.Add(new DataColumn("Text"));
            _data.Columns.Add(new DataColumn("CommandValue"));

            DataRow _row1 = _data.NewRow();
            _row1["Text"] = "Butch";
            _row1["CommandValue"] = "31";
            DataRow _row2 = _data.NewRow();
            _row2["Text"] = "Karl";
            _row2["CommandValue"] = "2";
            DataRow _row3 = _data.NewRow();
            _row3["Text"] = "Suzie";
            _row3["CommandValue"] = "8";
            DataRow _row4 = _data.NewRow();
            _row4["Text"] = "Kara";
            _row4["CommandValue"] = "31";

            _data.Rows.Add(_row1);
            _data.Rows.Add(_row2);
            _data.Rows.Add(_row3);
            _data.Rows.Add(_row4);




            _childdata.Columns.Add(new DataColumn("Text"));
            _childdata.Columns.Add(new DataColumn("CommandValue"));

            DataRow _crow1 = _childdata.NewRow();
            _crow1["Text"] = "Butch";
            _crow1["CommandValue"] = "Cupcakes";
            DataRow _crow2 = _childdata.NewRow();
            _crow2["Text"] = "Karl";
            _crow2["CommandValue"] = "Cheese";
            DataRow _crow3 = _childdata.NewRow();
            _crow3["Text"] = "Suzie";
            _crow3["CommandValue"] = "Pizaa";
            DataRow _crow4 = _childdata.NewRow();
            _crow4["Text"] = "Kara";
            _crow4["CommandValue"] = "Tofu";
            DataRow _crow5 = _childdata.NewRow();
            _crow5["Text"] = "Butch";
            _crow5["CommandValue"] = "Bacon";
            DataRow _crow6 = _childdata.NewRow();
            _crow6["Text"] = "Karl";
            _crow6["CommandValue"] = "Ham";

            _childdata.Rows.Add(_crow1);
            _childdata.Rows.Add(_crow2);
            _childdata.Rows.Add(_crow3);
            _childdata.Rows.Add(_crow4);
            _childdata.Rows.Add(_crow5);
            _childdata.Rows.Add(_crow6);

            rptMain.DataSource = _data;
            rptMain.DataBind();

        }

        public void rptMain_ItemCreated(object sender, RepeaterItemEventArgs e)
        {

            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataRowView drv = (DataRowView)e.Item.DataItem;

                LinkButton ibtn = e.Item.FindControl("ibtnDoSomething") as LinkButton;
                Label mainLabel = e.Item.FindControl("lblMainData") as Label;
                ibtn.CommandArgument = drv["CommandValue"].ToString();
                mainLabel.Text = drv["Text"].ToString();
                DataView _dv = new DataView(_childdata, "Text = '" + drv["Text"].ToString() + "'", "Text", DataViewRowState.CurrentRows);
                Repeater _rptChild = e.Item.FindControl("rptChild") as Repeater;
                _rptChild.DataSource = _dv;
                _rptChild.DataBind();
            }

        }

        public void rptChild_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {

                Label childLabel = e.Item.FindControl("lblChildData") as Label;
                DataRowView drv = (DataRowView)e.Item.DataItem;
                childLabel.Text = drv["Text"].ToString();

            }
        }

        public void rptMain_ItemCommand(object sender, RepeaterCommandEventArgs e)
        {
            Console.Write("fdasdfsa");
        }
4

3 回答 3

1

转发器将在回发期间重新创建。这就是触发 OnItemCreated 事件的原因。未调用 OnItemCommand 的原因是您的 OnItemCreated 事件中发生了异常。该物业

e.Item.DataItem

在回发中不可用并返回 null。因此,当您尝试使用

ibtn.CommandArgument = drv["CommandValue"].ToString();

你最终会得到一个 NullReferenceException。

于 2010-02-17T16:21:37.697 回答
1

这对我来说可以阻止那些讨厌的 Item_Created 回发

protected void On_Item_Created(Object sender, DataListItemEventArgs e)
{
    if (!Page.IsPostBack)
    {
        //Do stuff
    }
}
于 2012-02-25T01:33:02.987 回答
0

您是否需要在链接按钮控件上指定 CommandName 属性?

于 2010-02-17T15:54:13.917 回答