Динамически включать кнопку ASP.net в GridView на основе другого элемента управления в GridView.

У меня есть gridview с флажком и выпадающим списком.

Флажок по умолчанию не установлен. Выпадающий список по умолчанию отключен.

В режиме редактирования сетки, когда пользователь устанавливает флажок, я хочу, чтобы раскрывающийся список стал активным. Если бы я мог сделать эту клиентскую часть, это было бы здорово, если нет, я хочу сделать это на стороне сервера БЕЗ необходимости нажимать кнопку «Обновить», а затем снова редактировать.

Это на С#

Спасибо!

Что я пробовал:

grdiview основан на источнике данных, поэтому изначально я пытался основывать включенное значение раскрывающегося списка на данных Eval значения данных флажка. Однако для этого требовалось установить флажок, нажать «Обновить», а затем отредактировать, чтобы включить ddl. Затем я подумал, что, может быть, автопостбэк поможет всем пользователям не нажимать кнопку «Обновить», а затем снова редактировать. Это не сработало. Однако то, что я действительно хочу, это решение на стороне клиента. Я думаю, что это должно работать, и событие на флажке должно фактически включить раскрывающийся список, я не думаю, что раскрывающийся список может прослушивать флажок, который нужно проверить. Однако я не знаю, как ссылаться на элемент управления из другого элемента управления в коде asp. Так что, возможно, я бы сказал что-то вроде OnCheckChanged = if Checked then ddl.enabled = true? Но я не уверен, как это написать, и я не знаю, могу ли я заставить это событие флажка оцениваться на стороне клиента.

@Tim - я пробовал это:

в событии rowdatabound:

CheckBox chk = e.Row.FindControl("checkbox1") as CheckBox;
                DropDownList ddl = e.Row.FindControl("dropdownlist1") as DropDownList;
                chk.Attributes.Add("onclick", "document.getElementById('" + ddl.ClientID + "').enabled = this.checked;");

Когда я нажимаю «Изменить», этот код ДЕЙСТВИТЕЛЬНО попадает, поэтому событие onclick добавляется к флажку. Но когда я устанавливаю флажок, выпадающий список не включается.

Спасибо, Тим! Это рабочее решение.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)\
{
if ((row.RowType == DataControlRowType.DataRow) && ((row.RowState & DataControlRowState.Edit) > 0))
CheckBox chk = e.Row.FindControl("checkbox1") as CheckBox;
            DropDownList ddl = e.Row.FindControl("dropdownlist1") as DropDownList;
            chk.Attributes.Add("onclick", "document.getElementById('" + ddl.ClientID + "').disabled = !this.checked;");
}

person kralco626    schedule 01.09.2010    source источник


Ответы (2)


Используйте RowDataBound чтобы добавить событие на стороне клиента к вашему флажку:

   GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        Select Case e.Row.RowState
            Case DataControlRowState.Edit
                Dim chk As CheckBox = DirectCast(e.Row.FindControl("MyCheckboxID"), CheckBox)
                Dim ddl As DropDownList = DirectCast(e.Row.FindControl("MyDropdownlistID"), DropDownList)
                chk.Attributes.Add("onclick", "document.getElementById('" & ddl.ClientID & "').disabled = ! this.checked;")
        End Select
    End Sub
person Tim Schmelter    schedule 01.09.2010
comment
@тим - круто. Я переведу это на C# и попробую. Хотя могу ли я также сделать что-то вроде onclick = document.getElementById(MyDropdownlistID.ClientID).enabled = this.checked;) прямо в коде asp.net? - person kralco626; 01.09.2010
comment
@ kralco626: возможно, идентификатор клиента еще не установлен в RowCreated-Event. Но, возможно, вместо этого вы можете использовать RowDataBound (думаем, этот атрибут сохраняется в ViewState, не так ли?). Там свойство ClientID должно быть окончательным. - person Tim Schmelter; 01.09.2010
comment
@ Тим, позволь мне попробовать. Я как раз собирался написать, что это не работает, может быть поэтому - person kralco626; 01.09.2010
comment
@Tim - я обновил свои вопросы тем, что пробовал. Это не работает. - person kralco626; 01.09.2010
comment
@kralco: извините, вы не упомянули мой обновленный ответ. Я изменил ... = this.checked; в = ! это.проверено;. Важным является восклицательный знак, что означает «нет». При установке флажка раскрывающееся меню теперь будет включено (не отключено). - person Tim Schmelter; 01.09.2010
comment
@Tim - я видел ваше изменение раньше, но использовал «включено», а не «отключено». Я даже не думал, что есть свойство под названием disabled. Я думал, что это было включено...? - person kralco626; 01.09.2010
comment
@Tim - Но, наверное, я ошибаюсь, свойство на стороне клиента должно называться отключенным? Потому что это сработало. Я опубликую свой окончательный код в своих вопросах, если вы хотите добавить решение С# к своему ответу. - person kralco626; 01.09.2010
comment
Свойство на стороне сервера имеет значение Enabled(msdn. microsoft.com/en-us/library/) и означает, что элемент управления даже не отображается как HTML. Атрибут на стороне клиента отключен: codetoad.com/javascript/enable_disable_form_element.asp - person Tim Schmelter; 01.09.2010
comment
@Tim - на самом деле вам нужно установить Visible = false, чтобы элемент управления не отображался. Enabled=false отобразит элемент управления, но для свойства disabled на стороне клиента будет установлено значение true. - person kralco626; 01.09.2010

что ты уже испробовал? Это легко сделать с помощью TemplateField и небольшого javascript http://msdn.microsoft.com/en-us/library/ms228046.aspx

person Community    schedule 01.09.2010
comment
Я обновил свой вопрос. Извините, надо было включить эту информацию с самого начала. - person kralco626; 01.09.2010