C# 在动态创建的gridview上选择的索引已更改

C# 在动态创建的gridview上选择的索引已更改,c#,asp.net,javascript,asp.net-ajax,C#,Asp.net,Javascript,Asp.net Ajax,我已经动态创建了一个gridview,现在我想在selectedindex发生更改时触发一个事件 GridView NewDg = new GridView(); NewDg.ID = "SubGridView" + e.Row.RowIndex.ToString(); NewDg.DataKeyNames = new string[]{"logentry_id"}; NewDg.SelectedIndexChanged += new EventHandler(NewDg_Selecte

我已经动态创建了一个gridview,现在我想在selectedindex发生更改时触发一个事件

 GridView NewDg = new GridView();
 NewDg.ID = "SubGridView" + e.Row.RowIndex.ToString();
 NewDg.DataKeyNames = new string[]{"logentry_id"};
 NewDg.SelectedIndexChanged += new EventHandler(NewDg_SelectedIndexChanged);
 NewDg.RowDataBound += new GridViewRowEventHandler(NewDg_RowDataBound);
RowDataBound可以工作,但我想它不会生成正确的回发URL。 在RowDataBound中,我有以下代码:

GridView sendingGridView = (GridView)sender;
e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
javascript:__doPostBack('SubGridView4','Select$0')
这将生成以下代码:

GridView sendingGridView = (GridView)sender;
e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
javascript:__doPostBack('SubGridView4','Select$0')
只是这不会导致回发到此函数:

        void NewDg_SelectedIndexChanged(object sender, EventArgs e)
    {

        GridView sendingGridView = (GridView)sender;
        ViewDetails(Convert.ToInt32(sendingGridView.SelectedDataKey["logentry_id"].ToString()));
    }

有人知道我做错了什么吗?

首先,在每次加载页面时都要重新创建网格?这是以这种方式创建网格的要求。第二,尝试点击RowCommand,并以这种方式查找命令名;也许那会成功发射;通过命令参数获得对命令的引用,如中所示:

void rowcmd(..) {
   if (e.CommandName != null && e.CommandName.StartsWith("Select")) {
       //Dothis
   }
}

我找到了我问题的答案:

我现在在gridview中使用gridview

            <asp:TemplateField>
            <ItemTemplate>
                <asp:GridView ID="SubGridView" 
我已经在此gridview上有一个数据绑定和一个选定的索引更改事件

在创建的行事件上,我执行以下操作:

        protected void Page_Load(object sender, EventArgs e)
    {
        GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated);
        GridView1.DataSource = dc.GetLogEntriesWithUsername();
        GridView1.DataBind();
        void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridView SubGridView = e.Row.FindControl("SubGridView") as GridView;
            List<GetLogEntriesWithUsernameByParentIdResult> subLogEntries = dc.GetLogEntriesWithUsernameByParentId(((GetLogEntriesWithUsernameResult)e.Row.DataItem).logentry_id).ToList();
            if (subLogEntries.Count > 0)
            {
                SubGridView.DataSource = subLogEntries;
                SubGridView.DataBind();
                (e.Row as ExtGridViewRow).ShowExpand = SubGridView.Rows.Count > 0;
            }
        }
    }
以及所选索引已更改事件:

        protected void GridView_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridView sendingGridView = (GridView)sender;
        ViewDetails(Convert.ToInt32(sendingGridView.SelectedDataKey["logentry_id"].ToString()));         
    }
ViewDetails函数在不同的div中显示所选日志项的详细信息。 现在我正忙于最后一步,那就是保持数据在单击行之前的状态


感谢您的帮助,但这是我问题的解决方案。

我认为您正在为其订阅事件的subgridview在第二次回发中不再存在;这就是事件没有出现的原因听起来很合乎逻辑,但也应该有一种方法来选择这个子网格视图,不是吗?嗯。。。当我一直在玩动态控件时,问题是它们不再存在,因此我的解决方法是检查请求对象以查看实际来自客户端的内容,并且在重新创建subgridview时,为了考虑这些值,您还可以使用通过jQuery在客户端上修改的隐藏字段。。。这也会更容易