Asp.net 创建表单控件的可变表行
我主要来自PHP和Javascript背景,我习惯于创建直接处理编写HTML的低级函数,或者创建React之类的声明性库,它允许您根据数据声明HTML的结构,然后用数据填充 现在我正在使用ASP.NET,我正在尝试以.NET的方式做更多的事情,而不是仅仅遵循我在其他框架中使用的相同模式 目标: 默认情况下,创建一个包含10行的表。这些行中的每一行都包含用户将在其中输入学生数据的文本框。如果他们认为合适,可以添加更多行。此数据不绑定到数据库或其他任何东西,它只用于填充电子邮件 我的第一次尝试: 最初,我尝试创建一个数据集,其中定义的模式与输入内容相匹配Asp.net 创建表单控件的可变表行,asp.net,vb.net,gridview,dataset,Asp.net,Vb.net,Gridview,Dataset,我主要来自PHP和Javascript背景,我习惯于创建直接处理编写HTML的低级函数,或者创建React之类的声明性库,它允许您根据数据声明HTML的结构,然后用数据填充 现在我正在使用ASP.NET,我正在尝试以.NET的方式做更多的事情,而不是仅仅遵循我在其他框架中使用的相同模式 目标: 默认情况下,创建一个包含10行的表。这些行中的每一行都包含用户将在其中输入学生数据的文本框。如果他们认为合适,可以添加更多行。此数据不绑定到数据库或其他任何东西,它只用于填充电子邮件 我的第一次尝试: 最
studentData = New DataSet()
studentData.Tables.Add()
studentData.Tables(0).Columns.Add("StudentID")
studentData.Tables(0).Columns.Add("StudentName")
studentData.Tables(0).Columns.Add("StudentGrade")
studentData.Tables(0).Columns.Add("ContactPhone")
在Init上,我将向表单添加10行,并将数据绑定到GridView
For index As Integer = 1 To ViewState("StudentCount")
tblStudents.Rows.Add(GetTableRow(index))
Next
grdStudents.DataSource = studentData
grdStudents.DataBind()
GridView的声明如下:
<asp:GridView ID="grdStudents" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Student Id#">
<ItemTemplate>
<asp:TextBox runat="server" ID="studentId" Value='<%# Eval("StudentId") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last/First Name">
<ItemTemplate>
<asp:TextBox runat="server" ID="studentName" Value='<%# Eval("StudentName") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Grade">
<ItemTemplate>
<asp:TextBox runat="server" ID="studentGrade" Value='<%# Eval("StudentGrade") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Phone #">
<ItemTemplate>
<asp:TextBox runat="server" ID="phone" Value='<%# Eval("ContactPhone") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我只是手动创建控件
' GetCellForControl is a little helper function which just puts a control in a cell and gives you the cell
Protected Function CreateTableRow(ByVal index As Integer)
Dim row As TableRow = New TableRow
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentId_" & index, .MaxLength = 10}))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentName_" & index }))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentGrade_" & index, .MaxLength = 3}))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "Phone_" & index, .TextMode = TextBoxMode.Phone}))
Return row
End Function
'In Page_Load
For index As Integer = 1 To ViewState("StudentCount")
tblStudents.Rows.Add(CreateTableRow(index))
Next
所以这个很好用。要检索数据,我可以循环遍历每个TableRow并将控件从其各自的TableCell中拉出,也可以使用每个控件的可预测ID来拉出数据
问题
好吧,这种方法是正确的,所以没有真正的问题,但我觉得我错过了一些东西。我对ASP和.NET编程基本上是新手,所以有很多功能我知道我还不知道。因此,我希望能够深入了解能够以更惯用的方式解决此问题的功能
到目前为止,我已经使用将GridView绑定到DataSet的声明式样式创建了其他表单,但大多数表单都涉及到DataSet的备份数据库。在这种情况下,它只是一系列相同的行输入,可以发生10到n次。看起来很简单,对吧?我目前的解决方案很简单。但对我来说,这只是硬编码10行和输入的下一步,肯定有更好的东西
我觉得我的第一次尝试是接近我想要的,但我只是不知道到底需要什么才能让一切顺利
在ASP.NET中是否有一种使用声明性方法来实现目标的方法
TL;DR:我在ASP.NET方面很差劲,我正试图通过理解以.NET方式解决问题的惯用方法,而不是从我习惯的其他框架或幼稚的命令式方式来逐渐减少差劲。。他最终使用了一个数据库,但是您可以使用他的一些代码将网格数据保存到一个datatable中,然后根据需要使用它
顺便说一句,数据集包含用于在数据库中检索、更新和删除数据的内置方法,因此,如果不使用数据库,则不需要数据集;一个数据表就足够了。Hth.tl;dr从一开始就开始了,否则我们必须阅读所有内容才能找到它[实际上,你太长了,读不下去了,这更像是一个P.S.所以它在哪里都很好。]
' GetCellForControl is a little helper function which just puts a control in a cell and gives you the cell
Protected Function CreateTableRow(ByVal index As Integer)
Dim row As TableRow = New TableRow
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentId_" & index, .MaxLength = 10}))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentName_" & index }))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "StudentGrade_" & index, .MaxLength = 3}))
row.Cells.Add(GetCellForControl(New TextBox With {.ID = "Phone_" & index, .TextMode = TextBoxMode.Phone}))
Return row
End Function
'In Page_Load
For index As Integer = 1 To ViewState("StudentCount")
tblStudents.Rows.Add(CreateTableRow(index))
Next