代码之家  ›  专栏  ›  技术社区  ›  Amanda Kitson

对于GridView中的复选框控件,以编程方式分配的CheckChanged事件不会激发。

  •  2
  • Amanda Kitson  · 技术社区  · 16 年前

    我有一个自定义的GridView控件,它扩展了标准的ASP.NET GridView控件。GridView的第一列由动态创建的复选框字段组成。 我在OnRowDataBound事件期间为复选框的CheckChanged事件分配了一个事件,但这些复选框甚至不会激发该事件。我将它们的autopostback属性设置为true,并且它们正在进行回发,但它甚至不尝试触发oncheckChanged事件。 这是我的代码: GridView的OnRowDataBound事件:

    protected override void OnRowDataBound(GridViewRowEventArgs e)
            {
                base.OnRowDataBound(e);
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
    
                    CheckBox chkSelect = (CheckBox)e.Row.Cells[CheckBoxColumnIndex].FindControl(InputCheckBoxField.CheckBoxID);
                    if (chkSelect != null)
                    {
                        Guid selectedValue = new Guid(DataKeys[e.Row.RowIndex].Value.ToString());
                        chkSelect.Checked = SelectedValues.Contains(selectedValue);
                        chkSelect.CheckedChanged += new EventHandler(CheckChanged_click);
                    }
                }
            }
    

    checkChanged事件:

    protected void CheckChanged_click(object sender, EventArgs e)
            {
                CheckBox chkSelect = (CheckBox)sender;
                GridViewRow gvr = (GridViewRow)chkSelect.Parent.Parent;
                Guid selectedValue = new Guid(DataKeys[gvr.RowIndex].Value.ToString());
                if (chkSelect.Checked && !this.SelectedValues.Contains(selectedValue))
                {
                    this.SelectedValues.Add(selectedValue);
                }
                else if (!chkSelect.Checked && this.SelectedValues.Contains(selectedValue))
                {
                    this.SelectedValues.Remove(selectedValue);
                }
                DataBind();
            }
    

    还有一件事。这以前是可行的,但在开发控件时,我发现它在页面加载时多次进行数据绑定。我检查了一下并开始修剪数据绑定,以便它在页面加载期间只绑定一次。这是这样做的副作用。

    我试过将checkChanged任务移动到OnInit,也移动到OnRowCreated,但它仍然不启动。

    1 回复  |  直到 15 年前
        1
  •  1
  •   IAbstract    16 年前

    关于您的活动:

     CheckBox chkSelect = (CheckBox)e.Row.Cells[CheckBoxColumnIndex].FindControl(InputCheckBoxField.CheckBoxID);
          if (chkSelect != null)
          {
               Guid selectedValue = new Guid(DataKeys[e.Row.RowIndex].Value.ToString());
               chkSelect.Checked = SelectedValues.Contains(selectedValue);
               chkSelect.CheckedChanged += new EventHandler(CheckChanged_click);
          }
    

    您似乎要在更改检查状态后发布事件。尝试:

     CheckBox chkSelect = (CheckBox)e.Row.Cells[CheckBoxColumnIndex].FindControl(InputCheckBoxField.CheckBoxID);
    
          if (chkSelect != null)
          {
                chkSelect.CheckedChanged += new EventHandler(CheckChanged_click);
                Guid selectedValue = new Guid(DataKeys[e.Row.RowIndex].Value.ToString());
                chkSelect.Checked = SelectedValues.Contains(selectedValue);
          }
    
    // if your done with chkSelect
    chkSelect.CheckedChanged -= CheckChanged_click;
    

    如果你的活动仍然没有启动,你就必须通过一步来看看 SelectedValue.Contains(selectedValue) 回来了。