Найти флажок и текстовое поле, размещенные внутри gridview, используя JavaScript - PullRequest
6 голосов
/ 07 июня 2011

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

// Мой код сетки.

<asp:GridView ID="DeptGrid" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="DeptId" HeaderText="ID"/>
                    <asp:BoundField DataField="DeptName" HeaderText="Department"/>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:CheckBox ID="addToCompanyBox"  onClick="EnableHODBox()" runat="server" />
                        </ItemTemplate>
                        <HeaderTemplate>
                            Add
                        </HeaderTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:TextBox ID="hodNameBox" runat="server" Width="200px" Enabled="false"></asp:TextBox>
                        </ItemTemplate>
                        <HeaderTemplate>
                            Dept Head
                        </HeaderTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

// Мой код JavaScript

<script type="text/javascript">
 function EnableHODBox() {
     //alert('hello');
     var GridView = document.getElementById('<%=DeptGrid.ClientID %>');
     //var GridView = document.getElementById('');
     var DeptId;
     if (GridView.rows.length > 0) {
         for (Row = 1; Row < GridView.rows.length; Row++) {
            // DeptId = GridView.rows.cell[0];
             if (GridView.rows[Row].cell[3].type == "checkbox")
             // var chkbox = GridView.rows[Row].cell[3].type == "checkbox"
                 (GridView.rows[Row].cell[3].type).checked = true;
         }
     }
 }
 </script>

Ответы [ 7 ]

2 голосов
/ 12 апреля 2016

Это решение протестировано и работает с использованием только JavaScript (для этого решения jQuery не требуется!) .

1. Часть C # (In Page_Load Метод)

В Page_Load нам нужно добавить небольшой хак:

foreach(GridViewRow row in YourGridViewControlID.Rows)
{
    if (row.RowType == DataControlRowType.DataRow )
    {
      ((CheckBox) row.FindControl("YourCheckBoxID")).Attributes.Add("onchange", "javascript:TextboxAutoEnableAndDisable(" + (row.RowIndex ) + ");");
    }
}

Таким образом, мы добавляем вызов функции JavaScript к событию OnChange каждого CheckBox нашего GridView. Что особенного, и мы не можем достичь с помощью HTML, так это то, что мы передаем Row Index каждого из них в функции JavaScript, что нам понадобится позже.

2. Некоторые важные заметки для части HTML

Убедитесь, что и Checkbox control, и Textbox control, но , что более важно ваш GridView Control имеет статический идентификатор, используя ClientIDMode="Static", как показано ниже:

<asp:CheckBox ID="YourCheckBoxID" runat="server" ClientIDMode="Static"/>
<asp:TextBox ID="YourTextBoxID" TextMode="SingleLine" runat="server" ClientIDMode="Static" />

И для GridView управления:

<asp:GridView ID="YourGridViewControlID" ...... ClientIDMode="Static" runat="server">

3. Часть Javascript

А затем в вашем файле JavaScript / код:

function TextboxAutoEnableAndDisable(Row) {
  // Get current "active" row of the GridView.
  var GridView = document.getElementById('YourGridViewControlID');
  var currentGridViewRow = GridView.rows[Row + 1];

  // Get the two controls of our interest.
  var rowTextBox = currentGridViewRow.cells[2].getElementsByTagName("input")[0];
  var rowCheckbox = currentGridViewRow.cells[0].getElementsByTagName("input")[0];

  // If the clicked checkbox is unchecked.
  if( rowCheckbox.checked === false) {
    // Empty textbox and make it disabled
    rowTextBox.value = "";
    rowTextBox.disabled = true;
    return;
  }

  // To be here means the row checkbox is checked, therefore make it enabled.
  rowTextBox.disabled = false;
}

4. Некоторые примечания для вышеуказанной реализации

  • Обратите внимание, что в коде JavaScript в строке:
    var currentGridViewRow = GridView.rows[Row + 1];
    [Row + 1] важен для этой работы и не должен меняться.
  • И наконец:

следующие строки:

var rowTextBox = currentGridViewRow.cells[2].getElementsByTagName("input")[0];
var rowCheckbox = currentGridViewRow.cells[0].getElementsByTagName("input")[0];

Возможно, .cells[2] и .cells[0] для вас различны, поэтому вы должны выбрать правильный номер в [].
Обычно это номер столбца вашего GridView, начиная с 0.

Так что, если ваш CheckBox был в первом столбце GridView, тогда вам нужно .cells[0].
Если ваш TextBox находится во втором столбце вашего GridView, то вам нужно .cells[1] (в моем случае выше, TextBox было в третьем столбце моего GridView и, следовательно, я использовал .cells[2])

1 голос
/ 07 июня 2011

Вы можете использовать JavaScript onclick вместо события OncheckedChanged, которое является событием на стороне сервера CheckBox.

<asp:CheckBox ID="CheckBox2" runat="server" onclick="Javascript:JSfunctionName();" />

Edit:

var GridView = document.getElementById('<%=DeptGrid.ClientID %>')

Редактировать: По вашему запросу в комментарии

 if (GridView.rows[Row].cell[2].type == "checkbox")
 {
    if (GridView.rows[Row].cell[2].childNodes[0].checked)
    {
       GridView.rows[Row].cell[3].childNodes[0].disabled=false;// Enable your control here
    }
 }
0 голосов
/ 13 марта 2015
var x = document.getElementById('<%=grdResults.ClientID%>').querySelectorAll("input");
var i;
var cnt = 0;
for (i = 0; i < x.length; i++) {
     if(x[i].type== "checkbox" && x[i].checked)
     cnt++;
}
alert("item selected=" + cnt);
0 голосов
/ 07 января 2014

Найти элементы управления в сетке, используя java-скрипт:

for (var r = 1; r < grid.rows.length; ++r) {

    var indexValue = 0; //based on browser. //IE8
    var txtPeriod= grid.rows[r].cells[2].childNodes[indexValue];
    if (typeof (txtPeriod.value) == "undefined")//IE9                      
        indexValue = 1
     var txtPeriod= grid.rows[r].cells[2].childNodes[indexValue];
     alert(txtPeriod.value);
}
0 голосов
/ 25 октября 2013

Привет, у вас очень простое решение.

Предположим, ваша сетка выглядит так:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Height="64px"
    Width="389px" EnableViewState="False">
    <Columns>
        <asp:TemplateField HeaderText="EmployeeId">
            <ItemTemplate>
                <asp:Label ID="lblEmployeeId" runat="server" Text=""></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="FirstName">
            <ItemTemplate>
                <asp:Label ID="lblFirstName" runat="server" Text=""></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="LastName">
            <ItemTemplate>
                <asp:Label ID="lblLastName" runat="server" Text=""></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <HeaderStyle BackColor="#FF66FF" ForeColor="#660033" />
</asp:GridView>

и ваш javascript для поиска элементов управления внутри вашей сетки равен

   <script language="javascript" type="text/javascript">
        $(document).ready(function () {
            $("#btnAddToGrid").click(function () {
                var $grid = $('#<%=GridView1.ClientID %>');
                var $row = $grid.find('tr:last').clone().appendTo($grid);
                var employeeId = $row.find("span[id*='lblEmployeeId']").text();
                var firstname =  $row.find("span[id*='lblFirstName']").text();
                var lastname = $row.find("span[id*='lblLastName']").text();
              alert("ID :" + employeeId +"\n" + "Name :" + firstname +" "+ lastname );
            });
        });
    </script>
0 голосов
/ 14 октября 2013

Вы можете определить свою сетку следующим образом:

 <div>
   <asp:GridView ID="GridView1" runat="server"  Width = "550px"
    AutoGenerateColumns = "false" Font-Names = "Calibri" 
    Font-Size = "12pt" HeaderStyle-BackColor = "LightYellow" AllowPaging ="true"  ShowFooter = "true"  OnPageIndexChanging = "OnPaging" PageSize = "10" >
   <Columns>
      <asp:TemplateField ItemStyle-Width = "100px"  HeaderText = "Name">
        <ItemTemplate>
         <asp:TextBox ID="txtPeriod" runat="server" CssClass="css1 mycss" Text='<%# Eval("Period")%>' 
             onblur="SetPostingPeriod(this)"></asp:TextBox>
        </ItemTemplate>                       
    </asp:TemplateField>   
   </Columns> 
   <AlternatingRowStyle BackColor="#C2D69B"  />
</asp:GridView> 
</div>

И ваша функция Javascript будет:

<script language="javascript" type="text/javascript">
     /* Populating same data to all the textboxes inside grid, 
     once change of text for one textbox - by using jquery
     */
     function SetPostingPeriod(obj) {

         var cntNbr = $("#" + obj.id).val();
      // var cntNbr = document.getElementById(obj.id).value;
      // alert(cntNbr);

         //Access Grid element by using name selector
         $("#<%=GridView1.ClientID %> input[name*='txtPeriod']").each(function (index) {

             if ($.trim($(this).val()) != "")
                 if (!isNaN($(this).val())) {
                     $(this).val(cntNbr);
                 }
         });
     }
 </script>

Эта функция Javascript называется событием onblur текстового поля. Когда эта функция вызывается одновременно, она передает параметр который является ничем иным, как идентификатором текстового поля.

Внутри функции JavaScript, используя параметр, который является Идентификатор текстового поля мы получаем vaue.

Вот код:

      var cntNbr = $("#" + obj.id).val();

Тогда Для каждого из элементов управления "txtPeriod", доступных внутри сетки, нам нужно назначить значение текущего значения текстового поля "txtPeriod" для них.

Looping Grid для идентификации каждого доступного «txtPeriod»: Вот код:

 $("#<%=GridView1.ClientID %> input[name*='txtPeriod']").each(function (index) {

 });

Внутри этого цикла нам нужно присвоить значение "txtPeriod" (current / Modified) другим Текстовые поля "txtPeriod". Перед назначением рекомендуется проверять, является ли он нулевым или NAN. Вот код:

               if ($.trim($(this).val()) != "")
                 if (!isNaN($(this).val())) {
                     $(this).val(cntNbr);
                 }
0 голосов
/ 05 декабря 2012

Я также обнаружил, что выражение if (GridView.rows [Row] .cell [2] .type == "checkbox") приводит к ошибке, GridView.rows [Row] .cell [2] .type не определено , Код, который я сейчас использую, выглядит следующим образом:

    var grid = document.getElementById('<%=grdResults.ClientID%>');
    if (grid.rows.length > 0) {
        for (row = 1; row < grid.rows.length; row++) {
            if (grid.rows[row].cells[0].childNodes[0].checked) {
                // do something here
                alert('function for row ' + row);
            }                                  
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...