GridView со столбцом флажка.Скрипт на стороне клиента, чтобы снять все галочки, кроме текущего - PullRequest
0 голосов
/ 30 июня 2010

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

Я пытаюсь добиться этого с помощью сценария на стороне клиента, но безуспешно.В обработчике события RowDatabound GridView попытались добавить атрибут в 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 - как показано ниже:

if (! Page.ClientScript.IsClientScriptBlockRegistered ("ErrorsCheckBoxHandler")) Page.ClientScript.RegisterClientScriptBlock (GetType (), "ErrorsCheckBoxHandler", "function errorCheckChanged () {". Window);} ");

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

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

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

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

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

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

Спасибо

Грант

Ответы [ 2 ]

1 голос
/ 30 июня 2010

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

<Columns><br> <asp:TemplateField><br> <ItemTemplate><br> <asp:CheckBox ID="chkSelect" onclick="errorCheckChanged(this)" runat="server" /><br> </ItemTemplate><br> </asp:TemplateField><br> </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 голосов
/ 30 июня 2010

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

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

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

ЯШ:

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

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

...