用户控件内的可排序数据网格

本文关键字:数据 数据网 网格 排序 控件 用户 | 更新日期: 2023-09-27 17:58:36

我需要在用户控件中实现可排序的DataGrid。

我的主页代码如下:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    myPlaceHolder.Controls.Add(page.LoadControl("~/myControl.ascx") as MyCtrl);
}

用户控制看起来像这样:

<asp:DataGrid ID="myGrid" runat="server" Width="100%" AutoGenerateColumns="False"
    AllowSorting="True" OnSortCommand="Grid_Sort" EnableViewState="true" >
        <Columns>
            <asp:BoundColumn DataField="Clmn1" SortExpression="" HeaderText="" />
            <asp:BoundColumn DataField="Clmn2" SortExpression="Clmn2" HeaderText="Clmn2header" />
        </Columns>
    </asp:DataGrid>

所以我遇到了以下问题:当我点击自动生成的链接按钮Clmn2header对数据进行排序时,它会导致主页面重新加载(而不是返回),从而创建新的用户控件。所以post-back永远不会发生,排序方法Grid_Sort也永远不会被触发。

我确定ViewState已启用。

请帮帮我。我做错了什么?非常感谢。

编辑

实际上,我只是简化了用户控件初始化的样子:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    myPlaceHolder.Controls.Add(MyCtrl.createInstance(/*some params*/));
}

具体实例方法:

public static MyCtrl createInstance(/*some params*/)
{
    MyCtrl ctrl = page.LoadControl("~/myControl.ascx") as MyCtrl;
    ctrl._init(/*some params*/);
    return ctrl;
}
private void _init(/*some params*/)
{
    /*setting controls properties with params*/
}

用户控件内的可排序数据网格

什么是MyCtrl?为什么使用负载控制方法进行铸造?下面的行应该足以实例化您的控件,

myPlaceHolder.Controls.Add(page.LoadControl("~/myControl.ascx"));

您是否在页面的page_load事件中设置了IsPostBack()检查点&控件,我确信当您单击列头文本链接时,不应该有完整的页面回发。

if (!IsPostBack) { }

如果您的排序命令事件仍然没有命中,请告诉我。