Невозможно использовать findcontrol для извлечения текстового поля в gridview - двойные источники данных
I am trying to assign a value to a read-only TextBox which is lodged inside a DataGrid in a webpage. The TextBox is being reconstructed with each Postbox using automation called Add_TextBoxes. The TextBoxes inside the DataGrid can either be modified themselves by making an entry within the box (calls a method, TextBox_Changed) which is assigned idndividually, dynamically to each TextBox when they are created, or else via the automation which is causing me the problem. The automated call to update the textboxes within the grid is anchored inside longer textboxes, which are parsed based on a certain logic to distribute pieces of the Text (Substrings) to each of the textboxes in the grid. The problem I am having is that the textboxes inside the Grid are not being found. I am getting a Null Error exception. Here are some snippets of Code -
Внутри моей Page_Load (вложенный, если вызвать добавление текстовых полей в сетку после обратной передачи)
else if (Session["SrcCtrl"].ToString() == "Noms") { this.Add_TxtBoxes(); this.parse_Nomkey(); } }
Вот метод Add_TxtBoxes:
protected void Add_TxtBoxes() { List<sessVar> sessVars = ret_sv_data(); int rw = 0; int cl = 0; // Cursor through all 31 positions for (int i = 0; i <= 30; i++) { // Check to see if a new row for the data table / data grid is needed, - skipped on first iteration (row = 0) if (i > 0) { if (newRow(sessVars[i].Nompos) == true) { rw = rw + 1; } } // Check to see if a column change is needed (col + 2), as we move through each component of the nomenclature if (i >= 1) { if (sessVars[i - 1].Keyvis == false) { rw = 0; cl = cl + 2; } } // If session variable is visible in the grid, add its text box and description one column over if (sessVars[i].Keyvis == true) { Control thsctrl = this.FindControl("txtBoxNomPt" + rw + cl); TextBox txtBxNm = new TextBox(); txtBxNm.Width = 48; txtBxNm.ID = "txtBoxNomPt" + rw + cl; txtBxNm.AutoPostBack = true; txtBxNm.Attributes.Add("runat", "server"); txtBxNm.TextChanged += new EventHandler(TextBox_TextChanged); this.NomFlds.Rows[rw].Cells[cl].Controls.Add(txtBxNm); { if (!string.IsNullOrEmpty(sessVars[i].Value as string) || sessVars[i].Svexists == true) { txtBxNm.Text = sessVars[i].Value.ToString(); if (sessVars[i].Value.Substring(0, 1).ToString() == "*") { this.NomFlds.Rows[rw].Cells[cl + 1].Text = sessVars[i].PosDesc.ToString(); } else { TextBox_TextChanged(txtBxNm, EventArgs.Empty); txtBxNm.Text = Session[sessVars[i].Sessnm].ToString(); } } } } } }
Вот метод присвоения текстовому полю в сетке значения после того, как пользователь обновил одно из более длинных строковых текстовых полей "макрос" и выделил табуляцию, чтобы начать последовательность синтаксического анализа -
public void parse_str_arr(int[] pos, string[] cts, string inp_str) { int startpt = 0; String thsval = ""; for (int i = 0; i < pos.Length; i++) { if (pos[i] != -1) { string prow = cts[i].Substring(0, 1).ToString(); int ctrw = Int32.Parse(prow); GridViewRow thsrow = this.NomFlds.Rows[ctrw]; String ctrlnm = "txtBoxNomPt" + cts[i].ToString(); Control thsfld = this.FindControl(ctrlnm); // Control [] thsfldarr = Retr_Set(ctrlnm, ctrlnm.Length); // Control thsfld = thsfldarr[1]; TextBox thsfldtxt = thsfld as TextBox; if (inp_str.Length >= (startpt + PoslengthA[i])) { thsval = inp_str.Substring(startpt, PoslengthA[i]).ToString(); thsfldtxt.Text = thsval; TextBox_TextChanged(thsfld, EventArgs.Empty); Session[SessnameA[pos[i]]] = thsval; } else { thsval = ValueA[pos[i]]; thsfldtxt.Text = thsval; TextBox_TextChanged(thsfld, EventArgs.Empty); Session[SessnameA[pos[i]]] = thsval; } startpt = startpt + PoslengthA[pos[i]]; } } }
Вот где происходит моя ошибка. Элемент управления thsfldtxt не найден. При рендеринге я вижу текстовые поля и знаю, что они там есть. Но я их не нахожу. Либо есть скрытые постбэки, которые сдувают имена, либо у меня где-то есть проблема с синтаксисом. Я написал функцию для переназначения имен, но не знаю, где ее встроить. Это действительно заставило меня бежать!
Я использую большое количество массивов для управления этим приложением, потому что это много манипуляций со строками с использованием фиксированных правил. Поэтому, если есть вопросы о массивах и их функциях, не стесняйтесь задавать их.
Что я уже пробовал:
Попытался использовать классный инструмент, который я нашел в сети для получения элементов управления внутри DataGrids под названием FlattenHierarchy, который должен был устранить проблему контейнера данных для поиска вложенного элемента управления, но это тоже не сработало.