Программно назначенное событие CheckChanged не запускается для элемента управления checkbox в gridview - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть пользовательский элемент управления gridview, который расширяет стандартный элемент управления gridview asp.net. Первый столбец gridview состоит из динамически созданных полей checkbox. Я назначил событие событию CheckChanged флажков во время события OnRowDataBound, но флажки даже не запускают событие. У меня для свойства autopostback установлено значение true, и они выполняют обратную передачу, но она даже не пытается запустить событие OnCheckChanged. Вот мой код: Событие 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 Ответ

1 голос
/ 04 февраля 2010

Что касается вашего мероприятия:

 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...