2015-06-16 19 views
0

我在asp.net页面上动态创建了一个表格,通过创建基于行数的行在来自SQL数据库的数据集中。我使用了for循环来创建我的行和单元格,并在page_load()函数中使用填充的下拉列表。我的表格的创建方式应该是这样的,但是我需要在每行中的每个单元格获取选定的项目文本,以便在单击提交按钮后将其存储回数据库表格。我最初在我的asp页面上有一个占位符,并将其替换为加载时创建的表格。出于某种原因,当我尝试使用从表格单元格的下拉列表中获取选定项目的值在vb代码中的表格中动态创建

对于每个R作为的TableRow在LineupTable.Rows

msgbox(EmployeeDDL.SelectedItem.Text) 

下一个R

它给了我一个空值误差employeeddl.selecteditem.text。

这就是我如何生成我的表。

“动态创建表格的行和单元格,并用适当的控制和/或信息

 Dim numrows As Integer = dtEQP.Rows.Count 
     Dim numcells As Integer = 6 
     Dim j As Integer 


     For j = 0 To numrows - 1 
      r = New TableRow() 
      c1 = New TableCell() With {.Width = 300} 
      c1.Controls.Add(New LiteralControl(dtEQP.Rows(j).ItemArray(0))) 
      r.Cells.Add(c1) 

      c2 = New TableCell() With {.Width = 200} 
     Dim EmployeeDDL As New DropDownList() 
     EmployeeDDL.DataSource = dsEMP 
     EmployeeDDL.DataTextField = "FirstName" 
     EmployeeDDL.DataValueField = "ID" 
     EmployeeDDL.DataBind() 
     EmployeeDDL.Items.Insert(0, New ListItem("", "-1")) 
     c2.Controls.Add(EmployeeDDL) 
      r.Cells.Add(c2) 

      c3 = New TableCell() With {.Width = 180} 
      Dim CodeDDL As New DropDownList() 
      CodeDDL.Items.Add("0-Running") 
      CodeDDL.Items.Add("99-Idle") 
      CodeDDL.Items.Add("60-Down") 
      CodeDDL.Items.Add("1-Weather") 
      CodeDDL.SelectedValue = "99-Idle" 
      c3.Controls.Add(CodeDDL) 
      r.Cells.Add(c3) 

      c4 = New TableCell() With {.Width = 100} 
      Dim RideDDL1 As New DropDownList() 
      RideDDL1.DataSource = dsRide 
      RideDDL1.DataTextField = "Ridename" 
      RideDDL1.DataValueField = "RideID" 
      RideDDL1.DataBind() 
      RideDDL1.Items.Insert(0, New ListItem("", "-1")) 
      c4.Controls.Add(RideDDL1) 
      r.Cells.Add(c4) 

      c5 = New TableCell() With {.Width = 200} 
      Dim OTddl1 As New DropDownList() 
      OTddl1.DataSource = dsEMP2 
      OTddl1.DataTextField = "FirstName" 
      OTddl1.DataValueField = "ID" 
      OTddl1.DataBind() 
      OTddl1.Items.Insert(0, New ListItem("", "-1")) 
      c5.Controls.Add(OTddl1) 
      r.Cells.Add(c5) 


      c6 = New TableCell() With {.Width = 350} 
      Dim CommentsTxtBx As New TextBox() 
      c6.Controls.Add(CommentsTxtBx) 
      r.Cells.Add(c6) 


      LineupTable.Rows.Add(r) 
     Next j 

如何,我应该在我的点击子程序来获取这个值来得到什么实际选择任何想法​​填充它们?

+0

你在哪里创建控件?你在哪里调用你的循环来获取选定的项目?这看起来可能是页面生命周期的问题。 – MaCron

+0

在page_load();中创建控件,表格,表格和表格单元格。调用我的循环来获取我的save_click() –

+0

中的选定项目请记住,页面加载发生在点击按钮之前,因此如果您重新创建pageload上的控件,则在点击事件发生时它们是空白的,而且如果你不会在回发中创建你的控件,它们不会存在,你需要在oninit中创建你的控件。 [https://msdn.microsoft.com/en-us/library/ms178472.aspx]是了解页面生命周期的好文档。 – MaCron

回答

0

首先,当您添加DropDownList中,给它一个ID(使用游标变量,以避免重复ID):

EmployeeDDL.ID = "EmployeeDDL" & j.ToString() 

其次,由于DropDownList的被动态地添加你需要使用的FindControl得到它的一个实例。另外,确保SelectedItem不为空/无。

Dim intCursor As Integer = 0 
For Each r As TableRow In LineupTable.Rows 

    Dim ddlTarget As DropDownList = Cast(r.Cells(1).FindControl("EmployeeDDL" & intCursor.ToString()), DropDownList) 

    If Not ddlTarget.SelectedItem Is Nothing Then 

     Dim strValue = ddlTarget.SelectedItem.Text 

    End If 

    intCursor += 1 

Next r 
+0

这仍然不会返回任何文字。这几乎就好像selecteditem.text在一个新项目被选中后没有改变它的值。它只是返回它原来加载的空白值,并给我一个空错误。 –

+0

此解决方案创建了一个问题,即具有相同ID的多个行具有相同的dropdownlist,因为它们是以相同的方式动态创建的,并且导致系统崩溃并在尝试单击我的按钮时出现错误消息。我想我必须找到一些方法在后台编写代码,如果我要这样修复它,将会为每行创建一个唯一的ID。 –

+0

编辑uniqueId问题。 – N0Alias

相关问题