2010-02-04 79 views
2

我有一個自定義的gridview控件,它擴展了標準的asp.net gridview控件。 gridview的第一列由動態創建的複選框字段組成。 在OnRowDataBound事件中,我已將事件分配給複選框的CheckChanged事件,但複選框甚至沒有激發事件。我將他們的autopostback屬性設置爲true,並且他們正在執行回發,但它甚至不嘗試觸發OnCheckChanged事件。 這裏是我的代碼: 在GridView的OnRowDataBound事件:編程分配的CheckChanged事件不會觸發GridView中的複選框控件

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

至於你的事件:

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)正在恢復。

相關問題