2010-06-29 2 views
0

Я динамически привязываю типизированный список к элементу управления GridView. Элемент управления сеткой находится на странице asp.net, которая завернута в asp: UpdatePanel (Ajax). Первый столбец содержит элемент управления флажком. В этом столбце может быть указан только один флажок. Если пользователь установил флажок, все остальные флажки должны быть сняты.GridView с столбцом флажка. Клиентский скрипт для снятия отметки со всех, кроме текущего флажка

Я пытаюсь достичь этого, используя сценарий на стороне клиента без успеха. В обработчике события GridView RowDatabound попытались добавить атрибут в CheckBox, содержащийся внутри ячейки.

protected void ErrorGridView_RowDatabound(object sender, GridViewRowEventArgs e) 
    { 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 

     if(e.Row.Cells[0].HasControls()) 
     { 
      foreach (var control in e.Row.Cells[0].Controls) 
      { 
       if (!(control is CheckBox)) continue; 

       var checkBox = (CheckBox)control; 
       checkBox.Attributes.Add("CheckedChanged", "errorCheckChanged"); 
       return; 
      } 
     }   
    } 

Клиентская скрипт зарегистрирован обработчик событий Page_Load - как показано ниже:

если (Page.ClientScript.IsClientScriptBlockRegistered ("ErrorsCheckBoxHandler")!) Page.ClientScript.RegisterClientScriptBlock (GetType(), «ErrorsCheckBoxHandler», «function errorCheckChanged() {window.alert (\" here \ ");}");

Проблема заключается в том, что функция не вызывается при нажатии каких-либо флажков. Надеюсь, кто-то может пролить свет на то, что мне здесь не хватает?

Кроме того, что было бы лучшим способом выполнить отмену любых других флажков, отмеченных в целевом столбце?

Моим планом было бы изменить функцию errorCheckChanged, чтобы принять один параметр (объект флажка). Я бы изменил приведенный выше код; добавление в капельную атрибут подписи:

checkBox.Attributes.Add ("CheckedChanged", "errorCheckChanged (это)");

Надеется, я тогда буду в состоянии:
(1) определить, является ли состояние флажка «проверено». (Если он «проверен», затем продолжите ниже шагов)
(2) установите флажок parent (= cell), а затем определите затронутую строку GridView.
(3) Прокрутите все строки, установив флажки в «Проверено = false», за исключением текущей строки.

Будет ли это считаться правильным подходом?

Благодаря

Грант

ответ

1

Вы также можете добавить onclick событие checkbox во время разработки.

<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" onclick="errorCheckChanged(this)" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>

И JavaScript выглядит как

function errorCheckChanged(chkBox){ 
    var gridView = document.getElementById('<% =GridView1.ClientID %>'); 
    var Elements = gridView.getElementsByTagName('input'); 

    for(var i = 0; i < Elements.length; i++){ 
     if(Elements[i].type == 'checkbox' && Elements[i].id != chkBox.id && chkBox.checked) 
      Elements[i].checked = false; 
    } 
} 
+0

Отличный материал Selva. После этой концепции работал. За исключением того, что я не смог получить-getElementById ('<% = myGridView.ClientID%>', мне пришлось жестко закодировать значение. –

+0

Это не позволяет многократно проверять флажок. Как включить многократную проверку? – rickyProgrammer

+1

@rickyProgrammer Требование OP состоит в том, чтобы проверить выбранную 'CheckBox' и un проверить оставшиеся. Если вы хотите несколько проверок, используйте это. 'function errorCheckChanged() { var gridView = document.getElementById ('<% = GridView1.ClientID%>'); var Элементы = gridView.getElementsByTagName ('input'); для (var i = 0; i

0

использовать атрибут onclick, а не CheckChanged. я не думаю, что это действительное событие js.так

checkBox.Attributes.Add("onclick", "errorCheckChanged(this);"); 

, чтобы получить список флажков вы можете сделать

ЯШ:

var grid = document.getElementById('<% =GridView1.ClientID %>'); 
var checks = grid.getElementsByTagName('input'); 

вы должны проверить атрибут type, чтобы убедиться, что это флажок, или вы можете дать все флажки - конкретный класс для их логической группировки. в любом случае вы можете проверить свой идентификатор элемента click ed на этот список.

+0

Спасибо за быстрый ответ. Моя первая попытка использовала событие onclick. Только деталь, введенная при регистрации блока сценария, может просматриваться через View -> Source в браузере. Даже когда мне удалось запустить событие (при регистрации события onclick с фактическим столбцом (не флажок в столбце), источник не раскрывает атрибут для каждой строки. Я думаю, это связано с тем, что UpdatePanel шифрует информацию. –

+0

Обычно то, что вы видите при просмотре источника, это то, что было загружено изначально. После этого некоторые изменения javascript не будут применяться. Если вы используете IE8, вы можете открыть окно инструментов разработчика (f12), которое даст вам представление html , и после завершения запроса ajax вы можете обновить содержимое html (f5). – lincolnk

+0

Я удалил панели для просмотра Htlm. Я не думал об обновлении html-представления в окне инструмента разработчика. Спасибо за подсказку. сделайте это в будущем –

Смежные вопросы