2013-08-28 2 views
0

скрытое У меня есть GridView в ASP.NET, внутри колонны на этом GridView У меня есть следующие элементы управления:Невозможно найти флажок на ID в GridView на основе значения

<asp:TemplateField>  
    <ItemTemplate> 
     <input id='<%#Eval("po_asn_number") %>' class="css-checkbox" type="checkbox" />              
     <label for='<%#Eval("po_asn_number") %>' name="lbl_1" class="css-label"></label>   

     <asp:HiddenField ID="poid" runat="server" Value='<%#Eval("po_asn_number") %>' /> 
    </ItemTemplate>      
</asp:TemplateField> 

Это мой OnClick событие Кодекс позади.

protected void create_Click(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     HiddenField poid = ((HiddenField)gvr.Cells[0].FindControl("poid")); 

     if (((HtmlInputCheckBox)gvr.FindControl(poid.Value)).Checked == true) 
     { 
      Response.Redirect("ShipmentDetail.aspx?id=" + poid.Value); 
     } 
     else 
     { 
      //Do nothing 
     } 
    } 
} 

То, что я пытаюсь сделать здесь первый, я смотрю на скрытое значение которого является идентификатором для <input type="checkbox" />. Затем я проверяю, проверен ли флаг checkbox. Если это тогда, то что-то еще ничего не делает.

Когда нажмите на кнопку, я получаю ошибку:

Object reference not set to an instance of an object

Line 48:    if (((HtmlInputCheckBox)gvr.FindControl(checkbox)).Checked == true) 
Line 49:    { 
Line 50:     Response.Redirect("ShipmentDetail.aspx?id=" + poid.Value); 

Любая помощь вы можете предоставить будут оценены.

+0

Split что суматоха линии и сказать нам, какой объект вызывает ошибку, пожалуйста. –

+0

Не уверен, в какой строке вы ссылаетесь, но контроль, дающий мне проблемы, - это '' Я не могу найти этот элемент управления на основе значения 'HiddenField' – jorame

ответ

0

Вы должны смотреть только в строках данных, когда вы перебираете все строки сетки, потому что, когда вы не укажете только строки данных, она начинается с строки заголовка. Вы получаете исключение, потому что он не может передать результат FindControl() в тип. Поскольку в строке заголовка с этим именем нет элемента управления, FindControl() возвращает null, и литье взрывается.

Вместо этого:

protected void create_Click(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     // Only deal with data rows, not header or footer rows, etc. 
     if (gvr.RowType == DataControlRowType.DataRow) 
     { 
      HiddenField poid = ((HiddenField)gvr.FindControl("poid")); 

      // Check if hidden field was found or not 
      if(poid != null) 
      { 
       if (((HtmlInputCheckBox)gvr.FindControl(poid.Value)).Checked) 
       { 
        Response.Redirect("ShipmentDetail.aspx?id=" + poid.Value); 
       } 
       else 
       { 
        //Do nothing 
       } 
      } 
     } 
    } 
} 
+0

Я сделал ваше рекомендуемое изменение и я все еще получаю ту же ошибку. – jorame

+0

Я предполагаю, что он не находит ваше скрытое поле, тогда я обновил код, чтобы поместить предложение guard против скрытой переменной поля. Вам не нужно проходить через коллекцию «Ячейки», чтобы найти скрытый элемент управления полями, просто используйте метод «FindControl()» в строке. См. Обновленный ответ. –

+0

Любая конкретная причина, по которой вы используете HTML-вход вместо серверного элемента управления ASP.NET? –

1

Добавить runat атрибут.

<input id='<%#Eval("po_asn_number") %>' class="css-checkbox" type="checkbox" runat="server"/> 

Без этого атрибута вы не можете найти элемент управления в коде по серверному коду.

Также укажите точку останова, в которой вы получите значение Hidden field, чтобы подтвердить, что вы получаете ожидаемое значение.

Вам также необходимо реализовать изменение, которое предложил Карл, чтобы заставить его работать.

Новое дополнение: Изменить эту строку, чтобы добавить Cells [0] для следующей строки:

if (((HtmlInputCheckBox)gvr.Cells[0].FindControl(poid.Value)).Checked == true) 
+0

Не уверен, что вы подразумеваете под точкой прерывания. Я добавил 'runat =" сервер ", и я получаю другую ошибку. – jorame

+0

Точкой прерывания я хочу отлаживать код, чтобы увидеть, получаете ли вы значение в этой строке 'HiddenField poid = ((HiddenField) gvr.Cells [0].FindControl ("poid")); ' – Gloria

+0

Какая новая ошибка? – Gloria

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