2016-09-03 8 views
0

У меня возникла проблема с получением элементов управления/элементов управления, которые я создал вручную из кода позади. после исследования я обнаружил, что если я создам таблицу и весь ее компонент, включая любые элементы управления в методе Page_Init(), при рендеринге после обратной передачи текстовое значение элемента управления текстовыми полями должно быть доступно на странице. Я попытался найти элемент управления текстовым полем с помощью метода FindControl(). при отладке ее достигают только к линии, где я попытался найти элемент управления с помощью FindControl(), а затем выбросить исключение «объекта не задана ссылка на экземпляр объекта» ниже методне удается найти элементы управления из кода позади.

protected void Page_Init(object sender, EventArgs e) 
    { 
     Table tb = new Table(); 
     tb.ID = "Table1"; 
     TableRow row1 = new TableRow(); 
     TableCell cell1 = new TableCell(); 
     TableCell cell2 = new TableCell(); 
     TableCell cell3 = new TableCell(); 
     TextBox txtbx = new TextBox(); 
     Button btn = new Button(); 

     cell1.Text = "Name: "; 

     txtbx.ID = "table1_text_input"; 
     txtbx.ValidationGroup = "rosy"; 

     cell2.Controls.Add(txtbx); 
     btn.Text = "Get the input"; 
     btn.ValidationGroup = "rosy"; 
     btn.Click += getBoxinput_Click; 
     cell3.Controls.Add(btn); 

     // adding cells to row1 
     row1.Cells.Add(cell1); 
     row1.Cells.Add(cell2); 
     row1.Cells.Add(cell3); 

     // adding row to table1 
     tb.Rows.Add(row1); 
     Panel1.Controls.Add(tb); 

    } 

Page_Init() ниже - событие нажатия кнопки, которое предполагает отображение идентификатора элемента управления и его текста. Я застрял с этим последние пару дней. любая помощь будет оценена.

protected void getBoxinput_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if (IsPostBack) 
      { 
       Table t = (Table)Page.FindControl("Panel1").FindControl("Table1"); 
       TextBox tbox; 

       foreach (TableRow tr in t.Rows) 
       { 
        foreach (TableCell tc in tr.Cells) 
        { 
         foreach (Control cnt in tc.Controls) 
         { 
          if (cnt.GetType() == typeof(TextBox)) 
          { 
           tbox = (TextBox)cnt; 
           display.Text += "control id: " + tbox.ID + " control input: " + tbox.Text + "<br/>"; 
          } 
         } 
        } 
       } 
      } 


     } 
     catch (NullReferenceException ex) 
     { 

      display.Text += ex.Message; 
     } 

    } 

ответ

0

Может быть, я что-то отсутствует, но почему бы не просто положить все элементы управления в глобальной области видимости класса (вместо того, чтобы просто создавать экземпляры внутри Page_Init), так что вы можете получить доступ к ним в любой части твой класс. Конечно, я предполагаю, что Page_Init и getBoxinput_Click находятся в одном классе.

EDIT:

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

Table tb; //Declare variables outside any function. 

protected void getBoxinput_Click(object sender, EventArgs e) 
{ 
    tb = new Table(); //Initialize them inside a function. 
} 

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

+0

оба метода в этом классе. но когда вы говорите, что все средства управления в глобальном масштабе вы делаете, как вы это делаете? если это не слишком много, чтобы спросить, не могли бы вы показать мне какой-то код, который демонстрирует, чтобы вытащить все элементы управления со страницы. извините, я все еще учился. –

+0

Я всегда на шаг впереди, я думаю. извините, что после того, как вы рассказали мне о том, как вытащить элементы управления из глобального масштаба, я провел некоторое исследование и нашел то же, что и вы объяснили здесь. огромное спасибо за это. но, к сожалению, возникла новая проблема, которая возникает, когда я добавляю эту таблицу в панель, которая уже находится в файле .aspx, а не в коде за файлом, и выдает ошибку. и не позволяйте мне добавлять таблицу к панели. он бросает ту же ошибку, что и до того, как «ссылка на объект не установлена ​​в экземпляр объекта». Атрибут панели «runat» уже установлен на «server». –

+0

К сожалению, у меня нет большого опыта работы с ASP.NET, и поскольку ваша ошибка упоминает ' атрибут «runat» уже установлен на «server». Я предполагаю, что теперь что-то связано с ASP.NET, а не с C#. Мое лучшее предположение заключалось бы в изменении значения свойства «runat» на нечто иное, чем «server», а затем измените его на «сервер». Извините, я не могу больше использовать здесь. – Agustin0987

0

Ваш код работает отлично. Вот что я использовал для разметки формы:

<form id="form1" runat="server"> 
    <asp:Panel ID="Panel1" runat="server"></asp:Panel> 
    <asp:Label ID="display" runat="server"></asp:Label> 
</form> 

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

  • Нет связанных вопросов^_^