C# 行更新命令上的自定义multiselect gridview打断

C# 行更新命令上的自定义multiselect gridview打断,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个扩展的GridView类GridViewEx,它继承自基本的ASP.NET GridView。我重写CreateColumns方法来截取columns集合并注入我自己的列,其中包含一个修改过的CheckBoxField 旁注:我试着寻找一些其他的方法来存储和更新选中的行,只是使用复选框作为显示机制,但最终复选框是处理所有事情的最简单方法 CheckBoxField在创建时将其ReadOnly属性设置为true,在将其添加到columns集合时保持true,这将防止它作为参数传递给grid

我有一个扩展的GridView类GridViewEx,它继承自基本的ASP.NET GridView。我重写CreateColumns方法来截取columns集合并注入我自己的列,其中包含一个修改过的CheckBoxField

旁注:我试着寻找一些其他的方法来存储和更新选中的行,只是使用复选框作为显示机制,但最终复选框是处理所有事情的最简单方法

CheckBoxField在创建时将其ReadOnly属性设置为true,在将其添加到columns集合时保持true,这将防止它作为参数传递给gridview的数据源的更新请求

正如你可能推断的那样,这并没有发生。当我尝试执行行编辑和更新时,我会收到一个参数过多的警告,其中一个参数没有名称。如果我关闭multiselect函数,这将消失。所以我知道我的checkboxfield没有被视为只读字段。但我不知道如何修复它

关于我需要在何处、何时或如何设置此字段以使其不会自动作为参数传递给我的更新,有什么想法吗?

好的,我想好了

我还有一个自定义的CheckBoxField,它覆盖InitializeDataCell并写入我自己的复选框。我需要添加一个额外的检查,以便在设置Readonly时在编辑期间禁用该字段。这似乎解决了这个问题。希望这能帮助其他可能正在进行自定义GridView编辑的人

    internal class InputCheckBoxField : CheckBoxField
    {
        //... Some boilerplate for ID and other properties here

        protected override void InitializeDataCell(DataControlFieldCell cell, DataControlRowState rowState)
        {
            base.InitializeDataCell(cell, rowState);

            if (cell.Controls.Count == 0)
            {
                CheckBox chk = new CheckBox();
                chk.ID = CheckBoxID;
                chk.AutoPostBack = true;
                cell.Controls.Add(chk);

                //This was the needed check
                if(ReadOnly && rowState == DataControlRowState.Edit)
                    chk.Enabled = false;
            }
        }
    }