2012-04-17 34 views
0

我有一個方法可以創建文本框,具體取決於用戶必須輸入的參數值的數量。它的工作正常。問題是當用戶點擊確定時,我想將用戶在這些文本框中輸入的值替換爲字符串。當我搜索這些文本框來獲取文本值時,他們找不到它們。我如何獲得這些值以繼續我的項目?代碼是:如何在代碼的其他部分動態添加控件的值?

protected void btnPreview_Click(object sender, EventArgs e) 
    { 
     lbHeader.Text = "Template Designer"; 
     divQueryBuilder.Visible = false; 
     divTemplateDesigner.Visible = false; 
     divFloating.Visible = true; 

     if (txtQuery.Text.Contains("WHERE") || txtQuery.Text.Contains("where")||txtQuery.Text.Contains("Where")) 
     { 
      string[] splitter=new string[10]; 
      splitter[0]="Where"; 
      splitter[1]="WHERE"; 
      splitter[2]="where"; 
      splitter[3]="AND"; 
      splitter[4] = "and"; 
      splitter[5] = "And"; 
      string[] condition=txtQuery.Text.Split(splitter, StringSplitOptions.None); 
      int numberOfParameters = condition.Length - 1; 
      string[] Condition1 =null; 
      Label[] newLabel = new Label[10]; 
      TextBox[] txtBox = new TextBox[10]; 
      for (int i = 0; i < numberOfParameters; i++) 
      { 
       string lbValue="lbValue"; 
       string lbID=lbValue+i; 
       string txtValue = "txtValue"; 
       string txtID = txtValue + i; 
       HtmlGenericControl genericControl = new HtmlGenericControl("br/"); 
       Condition1 = condition[i + 1].Split('[', ']'); 
       newLabel[i] = new Label(); 
       txtBox[i] = new TextBox(); 
       newLabel[i].ID=lbID; 
       newLabel[i].Text = Condition1[1]; 
       txtBox[i].ID = txtID; 

       td2.Controls.Add(newLabel[i]); 
       td2.Controls.Add(genericControl); 
       td2.Controls.Add(txtBox[i]); 
       td2.Controls.Add(genericControl); 
       txtBox[i].EnableViewState = true; 
      } 
     } 
    } 

private bool ControlExistence(string lbID) 
    { 
     try 
     { 
      td2.FindControl(lbID); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      return false; 
     } 
    } 

    protected void btnOk_Click(object sender, EventArgs e) 
    { 
     // GetTextBoxValues(); 
     string[] splitter1 = new string[10]; 
     splitter1[0] = "Where"; 
     splitter1[1] = "WHERE"; 
     splitter1[2] = "where"; 
     splitter1[3] = "AND"; 
     splitter1[4] = "and"; 
     splitter1[5] = "And"; 
     string[] condition = txtQuery.Text.Split(splitter1, StringSplitOptions.None); 
     int numberOfParameters = condition.Length - 1; 
     string[] splitter = new string[4]; 
     splitter[0] = "["; 
     splitter[1] = "]"; 
     splitter[2] = "'"; 

     string[] queryBoxValue = txtQuery.Text.Split(splitter,StringSplitOptions.RemoveEmptyEntries); 
     StringBuilder query = new StringBuilder(); 
     TextBox txtBox = new TextBox(); 

     for (int i = 0; i < queryBoxValue.Length; i++) 
     { 
      if (!queryBoxValue[i].Contains("?")) 
      { 
       query.Append(queryBoxValue[i]); 
       query.Append(" "); 
      } 
      else 
      { 
       for (int counter1 = 0; counter1 < numberOfParameters; counter1++) 
       { 
        string txtValue = "txtValue"; 
        string txtID = txtValue + counter1; 
        if (ControlExistence(txtID)) 
        { 
         TextBox box = (TextBox)td2.FindControl(txtID); 
         string b = box.Text; 
         //txtBox.ID = txtID; 
        } 
        txtBox.Text = "'" + txtBox.Text + "'"; 
        queryBoxValue[i] = queryBoxValue[i].Replace(queryBoxValue[i], txtBox.Text); 
        query.Append(queryBoxValue[i]); 
       } 

      } 
     } 
     string fireQuery = query.ToString(); 
     adp = new SqlDataAdapter(fireQuery, conn); 
     tab = new DataTable(); 
     adp.Fill(tab); 
     if (tab.Rows.Count > 0) 
     { 
      string[] tempString = txtTemplate.Text.Split(' '); 
      for (int j = 0; j < tempString.Length; j++) 
      { 
       if (tempString[j].StartsWith("[")) 
       { 
        txtPreview.Text = txtTemplate.Text.Replace(tempString[j], tab.Rows[0][0].ToString()); 
       } 
      } 
     } 
     divFloating.Visible = false; 
     divQueryBuilder.Visible = false; 
     divTemplateDesigner.Visible = true; 
    } 

請幫忙。這已成爲我的阻礙者。

+0

看看你生成的HTML源代碼中實際使用什麼標識。我猜你會有舊的iding風格或可預測的。 – walther 2012-04-17 13:38:13

回答

0

有一個添加控件的列表,並在需要時使用它。

 for (int i = 0; i < numberOfParameters; i++) 
     { 
      // ... 

      td2.Controls.Add(newLabel[i]); 
      td2.Controls.Add(genericControl); 
      td2.Controls.Add(txtBox[i]); 
      td2.Controls.Add(genericControl); 

      addedTextBoxes.Add(txtBox[i]); 

      // ... 
     } 

,然後從代碼的另一部分:

var values = addedTextBoxes.Select(tb => tb.Text).ToList(); 

foreach (var txtBox in addedTextBoxes) 
{ 
    // ... 
} 

等等

+0

當autopostback發生時不會將它設置爲null? – Apoorva 2012-04-17 13:41:26

+0

如果存在回發,則可以將PARAMS添加到請求中,而不是保存到列表中。你可以打電話給他們(「txtBox」+我) – SimpleVar 2012-04-17 14:37:07

+0

我dint得到你的建議。你能否詳細說明一下? – Apoorva 2012-04-19 10:59:29

相關問題