mmmariaaa Ответов: 2

Код работает при "отладке"(F5) и открытии quickwatch, но не тогда, когда я запускаю его локально или в режиме "без отладки" (ctrl+f5)


Привет!
Я немного новичок в разработке систем, и у меня есть проблема.
Я не могу понять, почему мой код запускается, когда я его отлаживаю (но я тоже должен открыть quickwatch), а не когда я запускаю его локально или в режиме "без отладки". Это похоже на то, что ему нужна какая-то задержка(?). Но мне действительно нужно щелкнуть и открыть быстрые часы, чтобы получить значение идентификатора. В противном случае он равен нулю, и я получаю исключение.

То, что я хочу сделать, это:
Получите идентификатор (ctl103) автоматически созданной строки в таблице.
В браузере это выглядит так:
идентификатор="ctl00_ContentMainPage_gridViewId_ctl03_Панель"

Что я уже пробовал:

Код Aspx:
(Я удалил то, что, как мне кажется, является ненужным кодом.)
<div>
<!-- gridview -->
<asp:GridView ID="gridViewId" runat="server" AllowSorting="True" AutoGenerateColumns="False" CssClass="cssClass" CellPadding="3">
 <Columns>
  <asp:BoundField DataField="datafield1" HeaderText="datafield1" SortExpression="datafield1" ItemStyle-CssClass="HiddenCol">
  <asp:BoundField DataField="datafield2" HeaderText="datafield2">
  <asp:BoundField DataField="datafield3" HeaderText="datafield3">
  <asp:BoundField DataField="datafield4" HeaderText="datafield4">

  <asp:TemplateField>
    <ItemTemplate>
      <div>
<!-- collapsible panel inside the tabel -->
       <cc1:CollapsiblePanelExtender ID="CollapsiblePanelExtender1" runat="server"TargetControlID="StretchPanel" ExpandControlID="Panel1" CollapseControlID="Panel1" TextLabelID="Label1" Collapsed="true"> 
       </cc1:CollapsiblePanelExtender>
         <asp:Label ID="Label1" runat="server"></asp:Label>
         <asp:Panel ID="Panel1" runat="server">
         <asp:LinkButton ID="LinkButton" runat="server" ToolTip="pointer" CausesValidation="false" CommandArgument='<%# Container.DataItemIndex %>' OnCommand="LinkButton_Command">LinkbuttonName</asp:LinkButton>
          </asp:Panel>

          <%# AlterRow(Eval("Vägnr")) %>
          <asp:Panel ID="StretchPanel" runat="server">
<!-- ........more code....... -->

Код C#
protected void LinkButton_Command(object sender, CommandEventArgs e)        
{
            int rowIndex = Convert.ToInt32(e.CommandArgument);
            var id = e.CommandArgument.ToString();
            GridViewRow row = (gridViewId.Rows[int.Parse(id)]);
            var variable1 = row.Cells[0].Text;
            var variable2 = row.ID.ToString();    //here is where I got error 
                       //and need to open quickwatch to get an ID for the row

          // ......more code....


Сообщение об исключении:
System.NullReferenceException: "ссылка на объект не была установлена на экземпляр объекта".


2 Ответов

Рейтинг:
7

mmmariaaa

Этот, кажется, теперь работает на меня.

Я хотел получить то, что мне нужно. ID так что я мог бы использовать его в другом методе, где у меня был FindControl()... И тогда я подумал, что могу сравнить это ID с FindControl() Но я нашел другой способ (см. решение), там я перепрыгнул через линию, которая привела меня к ошибке, и вместо этого поставил FindControl() в foreach цикл, который вызвал мой собственный метод GetList(find_all_the_data_I_want) Я с самого начала думал, что мне нужно выяснить конкретные вещи . ID для этой дороги, чтобы проверить, совпадают ли они, но я думаю, что это больше не будет необходимо. Но все же я действительно не знаю, почему я не мог использовать первый пример, не отладив его.

protected void LinkButton_Command(object sender, CommandEventArgs e)        
{
   int rowIndex = Convert.ToInt32(e.CommandArgument);
   if (rowIndex > -1 && rowIndex < gridViewId.Rows.Count)
   {
      GridViewRow row = gridViewId.Rows[rowIndex];
      var variable1 = row.Cells[0].Text;
      var variable2 = row.ID.ToString();    //here is where I got error 
                       //and need to open quickwatch to get an ID for the row

          // ......more code....

      foreach (Section section in _sectionManager.GetList(sectionId))
       {
         if (sectionId != 0)
         {
          ((TextBox)row.FindControl("TextBox1")).Text = section.TextBox1;
          ((TextBox)row.FindControl("TextBox2")).Text = section.TextBox2;
          ((TextBox)row.FindControl("TextBox3")).Text = section.TextBox3;
         }
       }
    }
    else
    {
          // Index is out-of-range.
    }
       // ......more code....
}


Рейтинг:
0

phil.o

var variable1 = row.Cells[0].Text;
var variable2 = row.ID.ToString();
System.NullReferenceException: "ссылка на объект не была установлена на экземпляр объекта".
Это означает, что ID собственность компании row переменная равна нулю. Он не был инициализирован, как вы думали.

Вы можете использовать отладку, чтобы выяснить, почему.

Обновление:
Перечитывая этот вопрос, я понимаю, что нет смысла говорить вам использовать debug для сборки без отладки.
Я тогда подумал, уверены ли вы, что Класс GridViewRow (System.Web.UI.WebControls) | Microsoft Docs[^] держит в руках ID собственность? Может быть, вы подумали о том, GridViewRow.Собственность Параметр Rowindex (Системы.Веб.Пользовательского интерфейса.WebControls) | Майкрософт Документы[^] вместо этого? Но тогда это была бы проблема времени компиляции.

Можно также возразить против вашего процесса, состоящего в том, чтобы взять строковое представление целого числа только для того, чтобы позже разобрать его до исходного целочисленного значения. Это гораздо более серьезная проблема, и вы должны внимательно изучить эту часть: важность типов данных и их использование в разработке программного обеспечения. Здесь вам не понадобится id строковая переменная. У вас уже есть значение в другом месте, сохраненное с гораздо более эффективным форматом.
protected void LinkButton_Command(object sender, CommandEventArgs e)        
{
   int rowIndex;
   if (int.TryParse(e.CommandArgument, out rowIndex))
   {
      if (rowIndex > -1 && rowIndex < gridViewId.Rows.Count)
      {
         GridViewRow row = gridViewId.Rows[rowIndex];
         var variable1 = row.Cells[0].Text;
         var variable2 = row.ID.ToString();    //here is where I got error 
                       //and need to open quickwatch to get an ID for the row

          // ......more code....
       }
       else
       {
          // Index is out-of-range.
       }
       // ......more code....
    }
    else
    {
       // e.CommandArgument is not a valid 32-bits integer's string representation
    }
    // ......more code....
}


Richard Deeming

Ссылки на предыдущую строку row.Cells[0].Text, так что если только отладчик не указывает на неправильную строку, то это, вероятно, row.ID который null. :)

phil.o

Хорошая мысль! :большой палец вверх:
Я обновлю решение.

Richard Deeming

У него действительно есть ID свойство, от которого он наследует Control Но он почти наверняка ни на что не будет настроен. :)

Контроль.Свойство ID (System.Web.Пользовательский интерфейс) | Microsoft Docs[^]

phil.o

Это ответ на мой вопрос :)

mmmariaaa

Спасибо за ваши отзывы! :)
Теперь я понимаю, что вы имеете в виду, переводя строку в целое число и обратно, это кажется действительно глупым, поэтому я изменил ее, Спасибо!
Но моя проблема с "var variable2 = rad.ID.ToString ();" все еще остается. Я думал, что это имеет ценность для ID. Потому что когда я открываю quickwatch и смотрю как на строку, так и на идентификатор, кажется, что у него действительно есть значения, и код работает. Но когда я просто запускаю код, не глядя на быстрые часы, я получаю это сообщение об ошибке.

phil.o

Я тоже понял вашу точку зрения: наличие проблемы, которая появляется только во время отсутствия отладки, является своего рода стрессом. Об этом ID собственность, где вы ее устанавливаете? Не могли бы вы создать столбец в виде сетки и поместить туда его значение? Это позволит вам писать string variable2 = row.Cells[i].Text; где i это будет индекс дополнительного столбца.

mmmariaaa

Да, это может стать хорошей возможностью! Но я нашел другой способ решить свое дело. Но я до сих пор понятия не имею, почему это не сработало.