2015-02-26 3 views
0

Я пытаюсь сделать мои флажки в GridView более легкими для проверки для пользователя. Я добавил несколько jQuery, чтобы сделать элемент <td> доступным и установите флажок. Эта часть работает. Проблема в том, что когда пользователь нажимает фактический флажок, он не будет проверять. Когда я отлаживаю свой код, кажется, что .is (": checked") неверно возвращается. Любая помощь будет оценена.Флажок ASP.NET не проверяется с помощью jQuery

Мои GridView ItemTemplate

<asp:TemplateField HeaderText="Select" ItemStyle-Width ="5%" 
     ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="chk" > 
    <ItemTemplate> 
     <asp:CheckBox id="chkBxPSelect" runat="server" /> 
    </ItemTemplate> 
    </asp:TemplateField> 

Я также попытался обертывание флажок в метке, а также якорный тег, а не дало никаких результатов.

<asp:TemplateField HeaderText="Select" ItemStyle-Width ="5%" ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="chk" > 
    <ItemTemplate> 
     <label style="display:block;"> 
      <asp:CheckBox ID="chkBxPSelect" runat="server" /> 
     </label>                                    
    </ItemTemplate> 

Мой JQuery

$(".chk").click(function (e) 
{ 
    var checkBox = $(this).find("input:checkbox:first"); 

    if (checkBox.is(":checked")) 
    { 
     checkBox.prop("checked", false); 
    } 
    else 
    { 
     checkBox.prop("checked", true); 
    } 
}); 

Любые идеи?

EDIT Я также попытался добавить к нему флажок. Кажется, что проверка того, что флажок установлен, с помощью `.is (": checked "), не сообщает о правильном состоянии флажка.

$('input[id$="chkBxPSelect"]').click(function() 
{ 
    if ($(this).is(":checked")) 
    { 
     $(this).prop("checked", false); 
    } 
    else 
    { 
    $(this).prop("checked", true); 
    } 

});

И Я попробовал это также из предложения ниже.

$('input[id$="chkBxPSelect"]').click(function() 
{ 
    e.preventDefault(); 
    //e.stopPropagation(); 

}); 

и по-прежнему галочка не будет проверяться при нажатии на фактический флажок.

+0

ли ".chk" ваш класс флажок? если да, то почему вы пытаетесь найти еще один флажок ?, используя $ (this), должен предоставить вам фактический экземпляр (щелчок по нему), тогда вы можете получить его значение usin $ (this) .val() – kondas

+0

Что это за класс ".chk"? –

+0

.chk - это класс, который я добавил в ItemTemplate. Он находится в коде выше. Я использую его в CSS для изменения курсора на указатель, а также для jQuery для доступа к отображаемому элементу ''. Флажки находятся в GridView. – Trucktech

ответ

0

Это может работать:

$(".chk").click(function (e) 
{ 
    var checkBox = $(this).find("input:checkbox:first"); 
    if (checkBox.is(":checked")) 
    { 
     checkBox.prop("checked", false); 
    } 
    else 
    { 
     checkBox.prop("checked", true); 
    } 
}); 

$(".chk input[type=checkbox]:first").click(function (e) 
{ 
    e.preventDefault(); 
    e.stopPropagation(); 
}); 

Я не уверен, нужно ли вам preventDefault или stopPropagation, но я считаю, что это stopPropagation предотвратить флажок click от барботирования до своего родителя td.

Другим возможным решением было бы это. Если он работает, я бы рекомендовал его, так как он не требует какого-либо сценария:

<asp:TemplateField HeaderText="Select" ItemStyle-Width ="5%" 
     ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="chk" > 
    <ItemTemplate> 
     <label style="display:block;"> 
      <asp:CheckBox id="chkBxPSelect" runat="server" /> 
     </label> 
    </ItemTemplate> 
</asp:TemplateField> 

Когда флажок обернут внутри <label> элемента, щелкнув что-нибудь внутри этого ярлык будет переключать состояние проверяется CheckBox в. Предоставляя ярлыку отображение: стиль блока, этот должен занять все пространство ячейки таблицы (td), которое находится внутри. Таким образом, щелчок в любом месте td должен в threory переключить этот флажок.

+0

Я пробовал оба и ни один не работал. Селектор кажется хорошим, но, как я уже говорил выше (в моем отредактированном вопросе), .is («: checked») не сообщает о правильном состоянии флажка независимо от того, будет ли он проверен или нет. – Trucktech

+0

Я ответил на свой вопрос с вашей помощью. Вы, конечно, поставили меня на правильный путь, чтобы получить кредит. Спасибо. – Trucktech

0

Update: Вы могли бы выполнить свою задачу таким образом, то:

<td class="Validate"> 
    <asp:Checkbox id="chkSelect" runat="server" class="chkSelect" ... /> 
</td> 

Добавляя элемент класса, это даст Jquery что-то якорь на. Тогда вы могли бы сделать:

$('.Validate').click(function() { 
    var item = $(this).find('.chkSelect'); 
    if(item.is(':checked') { 
     item.prop('checked', false); 
    } else { 
     item.prop('checked', true); 
    } 
}); 

Итак, когда вы щелкаете ваш td JQuery будет выполняться, как и для нахождения вашего входа, вы дали ему идентификатор класса, который отражает ваш идентификатор. Итак, вы используете find для поиска дочерних элементов в пределах td element. Это должно найти ваш вход, тогда вы просто сделаете свой чек с помощью var, который установил флажок.


Вы могли бы по существу сделать следующее, которое обеспечит захват вашего контроля.

$('#<%= chkBxPSelect.ClientID %>').click(function() { 
    if($(this).is(':checked')) { 
     $(this).prop('checked', false); 
    } else { 
     $(this).prop('checked', true); 
    } 
}); 

Если $(this) не работает использовать полный идентификатор, как указано выше, но оценка Microsoft должна решить проблему. Ваш другой подход в JavaScript будет:

$(this).find('input[type="checkbox"]:first'); 

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

+0

Я действительно пытаюсь сделать обработанный элемент '' clickable. Не знаю, почему '' не отображался в моем исходном вопросе, но я его отредактировал. Кроме того, я использую файл сценария, поэтому .ClientID не будет работать. Однако я могу переместить его на страницу .aspx, если это возможно. – Trucktech

+0

@Trucktech Попробуйте мой обновленный ответ, так как вы пытаетесь использовать 'td', который я не видел, когда я отвечал. – Greg

0

У меня это выяснено с помощью @danludwig. Мне нужно было добавить обработчик кликов к флажку AND и e.stopPropagation(), чтобы предотвратить событие от пузырьков до td. Мне также пришлось обернуть флажок в теге метки и добавить к нему флажок CssClass, чтобы сделать его проще.

My new checkbox.

<asp:TemplateField HeaderText="Select" ItemStyle-Width ="5%" 
     ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="chk"> 
    <ItemTemplate> 
     <label style="display:block;"> 
      <asp:CheckBox ID="chkBxPSelect" runat="server" CssClass="chkBox" /> 
     </label> 
    </ItemTemplate> 
</asp:TemplateField> 

Мои новые методы JQuery:

$(".chk").click(function (e) 
{ 

    var checkBox = $(this).children("input:checkbox:first"); 


    if (checkBox.is(":checked")) 
    { 
     checkBox.prop("checked", false); 
    } 
    else 
    { 
     checkBox.prop("checked", true); 
    }  

}); 



$(".chkBox").click(function (e) 
{ 
    e.stopPropagation(); 

    if ($(this).is(":checked")) 
    { 
     $(this).prop("checked", false); 
    } 
    else 
    { 
     $(this).prop("checked", true); 
    } 

}); 
+0

Вы должны использовать 'find', а не' children'. 'children' выходит только на глубину слоя, где' find' будет искать все элементы. Веб-формы могут генерировать больше элементов, которые не знают о том, что может заставить его не работать. – Greg

+0

В документах [здесь] (http://api.jquery.com/children/). «Получить дочерние элементы каждого элемента в наборе согласованных элементов, необязательно отфильтрованных селектором». Таким образом, он фактически получает ВСЕ детей, если вы не укажете фильтр. Селектор, который я указал «input: checkbox: first', получит первый вход, который является флажком и помещает его в мой объект. Эта часть всегда работала.Это просто проверка фактического флажка, а не '', который давал мне припадки. Спасибо за помощь. – Trucktech

+0

Он получает только один уровень, поэтому он получит всех детей уровня корня. Если вам нужно идти глубже, вам нужно найти. – Greg

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