2015-08-27 3 views
1

Я пытаюсь вставить значения из динамического текстового поля в базу данных с помощью Entity Framework в Web Forms. В один клик он делает строку таблицы с тремя столбцами, и каждый столбец имеет одно текстовое поле. Каждый другой клик - еще одна строка.Динамические значения текстового поля в базе данных

public static int rowCnt = 0; 
    protected void BtnAddNewBuildItem_Click(object sender, EventArgs e) 
    { 
     // Current row count. 
     int rowCtr; 
     // Total number of cells per row (columns). 
     int cellCtr; 
     // Current cell counter 
     int cellCnt; 

     rowCnt = rowCnt + 1; 
     cellCnt = 3; 

     for (rowCtr = 1; rowCtr <= rowCnt; rowCtr++) 
     { 
      // Create new row and add it to the table. 
      TableRow tRow = new TableRow(); 
      TableBuildItems.Rows.Add(tRow); 

      for (cellCtr = 1; cellCtr <= cellCnt; cellCtr++) 
      { 
       // Create a new cell and add it to the row. 
       TableCell tCell = new TableCell(); 
       TextBox tb = new TextBox(); 

       // Set a unique ID for each TextBox added 
       tb.ID = "txtBuisniesItem_Row" + rowCtr + "Cell" + cellCtr; 
       // Add the control to the TableCell 
       tCell.Controls.Add(tb); 

       tRow.Cells.Add(tCell); 

      } 
     } 
    } 

Затем, нажав другую кнопку, я попытался вставить значения одной строки в базу данных, но allways - пустая строка.

using (VODOMONTEntities context = new VODOMONTEntities()) 
      { 
       BuildItem bi = new BuildItem(); 

       for (int i = 0; i < rowCnt; i++) 
       { 
        TextBox tb1 = new TextBox();       
        tb1.ID = "txtBuisniesItem_Row" + (i + 1).ToString() + "Cell" + 1; 
        bi.Name = tb1.Text; //there is a empty string allways 
        context.BuildItems.Add(bi); 
       } 
       context.SaveChanges();     
      } 

Итак, мой вопрос заключается в том, как вставить динамические значения texbox в базу данных, как в этом случае? Спасибо!

+0

Ваш TextBox объявлен и сразу после этого в том же контексте вы получаете доступ к его «Тексту», так как это может быть не пустая строка? Похоже, вам нужно управлять автоматически созданным текстовым полем, и вам нужна кнопка сохранения, чтобы получить текст текстового поля и сохранить их вместо того, чтобы поместить все в обработчик нажатия кнопки (который также используется для добавления большего количества элементов?). – Hopeless

+0

Спасибо за совет. Я меняю логику, и я нашел решение. – Dacke

ответ

1
protected void CreateNewBuild_Click(object sender, EventArgs e) 
    {   
     using (VODOMONTEntities context = new VODOMONTEntities()) 
     { 
      Build b = new Build(); 
      BuildItem bi = new BuildItem(); 

      b.BuildSubject = txbSubject.Text; 
      b.BuildNumber = txbBuildNumber.Text; 
      b.City = txbCityBuild.Text; 
      // b.BuildDate = txbBuildDate.Text; 
      b.ClientId = Int32.Parse(ddlClient.SelectedValue); 
      context.Builds.Add(b);      

      for (int i = 0; i < (RowIndexNumber-1)/3; i++) 
      { 
       TextBox[] tb = new TextBox[RowIndexNumber]; 
       tb[i*3] = new TextBox(); 
       tb[i*3] = (TextBox)FindControl("txtBuisniesItem_Row" + (i * 3 + 1).ToString()); 
       bi.Name = tb[i*3].Text; 

       tb[i*3+1] = new TextBox(); 
       tb[i*3+1] = (TextBox)FindControl("txtBuisniesItem_Row" + (i * 3 + 2).ToString());    
       bi.Quantity = Convert.ToInt32(tb[i * 3 + 1].Text); 

       tb[i*3+2] = new TextBox(); 
       tb[i*3+2] = (TextBox)FindControl("txtBuisniesItem_Row" + (i * 3 + 3).ToString()); 
       bi.Price = decimal.Parse(tb[i * 3 + 2].Text.ToString());           

       bi.Build = b; 
       context.BuildItems.Add(bi); 
       context.SaveChanges(); 

      } 
     }    
    } 

    public int RowIndexNumber = 1; 
    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     List<string> keys = Request.Form.AllKeys.Where(key => key.Contains("txtBuisniesItem_Row")).ToList(); 

     foreach (string key in keys) 
     { 

       this.CreateTextBox("txtBuisniesItem_Row" + RowIndexNumber); 
      if (RowIndexNumber % 3 == 0) 
      { 
       Literal lt = new Literal(); 
       lt.Text = "<br />"; 
       pnlTextBoxes.Controls.Add(lt); 
      } 
      RowIndexNumber++; 
     } 
    } 

    protected void BtnAddNewBuildItem_Click(object sender, EventArgs e) 
    { 

     int index = pnlTextBoxes.Controls.OfType<TextBox>().ToList().Count + 1; 
     this.CreateTextBox("txtBuisniesItem_Row" + index); 
     this.CreateTextBox("txtBuisniesItem_Row" + (index + 1).ToString()); 
     this.CreateTextBox("txtBuisniesItem_Row" + (index + 2).ToString()); 
     Literal lt = new Literal(); 
     lt.Text = "<br />"; 
     pnlTextBoxes.Controls.Add(lt); 
    } 
    private void CreateTextBox(string id) 
    { 
     TextBox txt = new TextBox(); 
     txt.ID = id; 
     txt.Attributes.Add("runat", "Server"); 
     pnlTextBoxes.Controls.Add(txt); 

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