C# 以DataGrid作为子控件的CompositeControl。不触发更新/取消事件

C# 以DataGrid作为子控件的CompositeControl。不触发更新/取消事件,c#,asp.net,.net,C#,Asp.net,.net,我正在尝试创建一个CompositeControl,其中包含一个DataGrid作为子控件。我使用了Edit命令,但是更新(我删除了本例中的更新事件代码,以便于阅读)和取消事件没有被触发。我真的不知道我做错了什么,谷歌也没有提供关于这个主题的教程(Datagrid作为CompositeControl的子控件)。有人知道我做错了什么吗 [ToolboxData("<{0}:ConfigEditor runat=server></{0}:ConfigEditor>")] pu

我正在尝试创建一个CompositeControl,其中包含一个DataGrid作为子控件。我使用了Edit命令,但是更新(我删除了本例中的更新事件代码,以便于阅读)和取消事件没有被触发。我真的不知道我做错了什么,谷歌也没有提供关于这个主题的教程(Datagrid作为CompositeControl的子控件)。有人知道我做错了什么吗

[ToolboxData("<{0}:ConfigEditor runat=server></{0}:ConfigEditor>")]
public class ConfigEditor : CompositeControl, INamingContainer
{
    private DataGrid data;

    public ConfigEditor()
    { }

    protected override void CreateChildControls()
    {
        Controls.Clear();
        data = new DataGrid();
        data.AutoGenerateColumns = false;
        data.BorderWidth = 0;
        data.EnableViewState = false;
        data.CssClass = "table table-condensed table-striped";
        data.EditCommand += new DataGridCommandEventHandler(data_EditCommand);
        data.CancelCommand += new DataGridCommandEventHandler(data_CancelCommand);

        PopulateData();

        Controls.Add(data);

        base.CreateChildControls();
    }

    void data_CancelCommand(object source, DataGridCommandEventArgs e)
    {
        data.EditItemIndex = -1;
        PopulateData();
    }

    void data_EditCommand(object source, DataGridCommandEventArgs e)
    {
        data.EditItemIndex = e.Item.ItemIndex;
        PopulateData();
    }

    void PopulateData()
    {
        var myConfigManager = SessionState.AppContext.GetProvider<ConfigManager>();
        data.DataSource = myConfigManager.LoadConfigItemsDt();
        data.Columns.Clear();

        TemplateColumn tcKey = new TemplateColumn();
        tcKey.HeaderText = "KEY";
        tcKey.ItemTemplate = new DefaultItemTemplate("KEY");
        tcKey.EditItemTemplate = new DefaultItemTemplate("KEY");
        data.Columns.Add(tcKey);

        TemplateColumn tcString = new TemplateColumn();
        tcString.HeaderText = "String";
        tcString.ItemTemplate = new DefaultItemTemplate("ValueString");
        tcString.EditItemTemplate = new EditTextBoxTemplate("ValueString");
        data.Columns.Add(tcString);

        TemplateColumn tcButtons = new TemplateColumn();
        tcButtons.ItemTemplate = new EditControlTemplate("KEY");
        tcButtons.EditItemTemplate = new UpdateControlTemplate("KEY");
        data.Columns.Add(tcButtons);

        data.DataBind();
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        data.RenderControl(output);
    }
}
[ToolboxData(“”)
公共类ConfigEditor:CompositeControl,INamingContainer
{
私有数据网格数据;
公共配置编辑器()
{ }
受保护的覆盖无效CreateChildControls()
{
控件。清除();
数据=新数据网格();
data.AutoGenerateColumns=false;
data.BorderWidth=0;
data.EnableViewState=false;
data.CssClass=“表压缩表条带化”;
data.EditCommand+=新的DataGridCommandEventHandler(data_EditCommand);
data.CancelCommand+=新的DataGridCommandEventHandler(数据\u CancelCommand);
填充数据();
控件。添加(数据);
base.CreateChildControls();
}
void data_CancelCommand(对象源,DataGridCommandEventArgs e)
{
data.EditItemIndex=-1;
填充数据();
}
void data_EditCommand(对象源,DataGridCommandEventArgs e)
{
data.EditItemIndex=e.Item.ItemIndex;
填充数据();
}
void PopulateData()
{
var myConfigManager=SessionState.AppContext.GetProvider();
data.DataSource=myConfigManager.LoadConfigItemsDt();
data.Columns.Clear();
TemplateColumn tcKey=新建TemplateColumn();
tcKey.HeaderText=“KEY”;
tcKey.ItemTemplate=新的DefaultItemTemplate(“KEY”);
tcKey.EditItemTemplate=新的DefaultItemTemplate(“键”);
data.Columns.Add(tcKey);
TemplateColumn tcString=新TemplateColumn();
tcString.HeaderText=“字符串”;
tcString.ItemTemplate=新的DefaultItemTemplate(“ValueString”);
tcString.EditItemTemplate=新的EditTextBoxTemplate(“ValueString”);
data.Columns.Add(tcString);
TemplateColumn tcButtons=新建TemplateColumn();
tcButtons.ItemTemplate=新的EditControlTemplate(“键”);
tcButtons.EditItemTemplate=新的UpdateControlTemplate(“键”);
data.Columns.Add(tcButtons);
data.DataBind();
}
受保护的覆盖无效渲染内容(HtmlTextWriter输出)
{
数据。渲染控制(输出);
}
}

以下几句话可能有用,也可能没用:

    <> >我考虑使用<代码> GRIDVIEW 而不是<代码> DATAGRID代码>数据网格自.NET 2.0以来已过时

  • 代码中的一个奇怪之处是,您正在从
    CreateChildControls
    (CreateChildControls>PopulateData>DataBind)调用
    DataBind
    。此外,在将DataGrid添加到控件树之前调用它,这意味着绑定期间所做的任何更改都不会持久化到ViewState。我不太清楚如果没有更多的代码会有什么样的影响,但我肯定会考虑CeaDeaCaldField[D/P>
我按照下面的指南解决了这个问题:我基本上忘记了只有在没有回发的情况下才绑定数据,并且弄乱了创建数据网格的顺序