Asp.net 无法定位动态创建的标签和文本框
我正在构建一个动态创建的弹出窗口,其中包含一个动态创建的网格和控件(标签和文本框)。 网格部分工作正常,不是问题。然而,控制给我带来了问题。 其思想是为网格中的每个列创建一个Asp.net 无法定位动态创建的标签和文本框,asp.net,vb.net,position,controls,Asp.net,Vb.net,Position,Controls,我正在构建一个动态创建的弹出窗口,其中包含一个动态创建的网格和控件(标签和文本框)。 网格部分工作正常,不是问题。然而,控制给我带来了问题。 其思想是为网格中的每个列创建一个标签和一个文本框。我可以很好地创建它们,但根本无法定位它们label.Location、label.Top、label.point等。返回一个错误,说明它不是标签的一部分。同样的情况也发生在文本框中。 当它们显示时,它们出现在一个水平行中,文本框与标签重叠,除非宽度设置得足够大(当然会留下一堆空白)。 我希望标签与标签后的文
标签
和一个文本框
。我可以很好地创建它们,但根本无法定位它们label.Location
、label.Top
、label.point
等。返回一个错误,说明它不是标签的一部分。同样的情况也发生在文本框中。
当它们显示时,它们出现在一个水平行中,文本框
与标签
重叠,除非宽度设置得足够大(当然会留下一堆空白)。
我希望标签与标签后的文本框
垂直对齐。
比如:
labelText:TextBox
这些控件正在添加到asp:Panel
(pnlFields)中
我想尝试使标签的宽度与它包含的文本一样长,而不是静态的,这样我(希望)能够将文本框的位置设置在标签的后面
无论如何,我似乎根本无法指定一个位置来完成这项工作。
有什么想法吗
谢谢
编辑:标记
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:Panel runat="server" ID="pnlFields" CssClass="FormStyle" Height="600px" />
<asp:Panel runat="server" ID="pnlFinder" CssClass="FormStyle">
<telerik:RadGrid ID="batchRecords" runat="server" Skin="Windows7" ShowHeader="true" AutoGenerateColumns="true" Width="600px" AutoPostBack="true">
<MasterTableView CommandItemDisplay="Bottom" AllowPaging="true">
<CommandItemSettings ShowAddNewRecordButton="false" />
<Columns>
<telerik:GridButtonColumn UniqueName="selectRecord" HeaderText="Edit" CommandName="Select" Text="Edit Record" ButtonType="ImageButton" ImageUrl="~/images/icons/pencil.png">
</telerik:GridButtonColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
</asp:Panel>
</asp:Content>
我真的很喜欢,但我真的不认为有必要创建这些文本框。有大量内置的重复控件。如果您在运行中创建这些控件,则无法连接事件背后的代码-因此您完全放弃了使用asp.net和所有这些优秀内置控件的全部理由
我看不出有什么理由可以插入并包含一些额外的“div”,并将样式应用于这些div。但是,在你走那条路之前
您应该尝试提出一个非常有力的例子,说明为什么您要走这条路,而不是使用listview、gridview或repeater控件。它们被设计用于反复重复数据,并且只需要很少的代码和很少的标记就可以做到这一点
这些数据从哪里来填写这些控制?或者甚至是相反的——控件的reulst将放在哪里?你看,通过使用中继器或其他什么?它们是数据绑定的。因此,一个人可以说添加2行或15行数据,然后在一个sql更新操作中,您可以写出所有这些数据换言之,您正在重复一些控制-但基于什么和如何是这里的大问题
如前所述,如果创建+注入这样的控件,那么就不能为这些控件创建或连接事件。所以,仔细想想这里的最终目标。您可能会修复布局问题,但接下来的问题/问题将是事件代码,然后是获取该输入并以某种方式将其推回到某个数据库所需的复杂代码。因此,我真的不推荐这条路
此外,使用其中一个内置的“重复”对象可以相对轻松地在屏幕上编辑该数据,如前所述,可以使用相同的代码写回一行或15行数据,并且比尝试将动态控件插入该表单要容易得多。此外,一旦成功注入这些控件,您将使用什么“id”来引用这些控件
这里的最终目标是关键概念
我发现gridview很不错——通常很少加价。但是,当您开始在该网格中有3个或更多自定义控件时?然后我喜欢listview而不是gridview(因为listview允许您拖放并使用标准asp.net控件,而无需将该控件放入模板块中。但是,您的情况是?网格的每一行只有两个额外的控件?当然,请坚持使用grid view
那么,要将这两个额外的列添加到该网格中,您可以执行以下操作:
首先,我将使用向导创建这个gridview。然后,我将取消data sourceID设置,并取消窗体上的datasource控件
因此,我计算的时间少于1分钟-放下gridview。单击表单中的“配置数据源”。这一个:
因此,我配置了数据源,生成了gv,然后删除了数据源ID,还从标记中删除了数据源控件。因此,这需要30秒的时间,最后我使用了以下网格:
因此,我们得到:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
</Columns>
</asp:GridView>
现在我们有了这个:
好吧,我花了更少的时间写这篇文章,还不错
请注意,我们如何只使用大约3行代码来加载网格
超级容易
好的,现在让我们向网格添加一个标签和一个文本框
那么,只需对gv模板执行以下操作:
请注意,我们刚刚添加了两个额外的列。标记如下:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
<asp:TemplateField HeaderText = "My label">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "My Text Box">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim MyLabel As New Label
MyLabel.ID = "Label1"
MyLabel.Text = "Label Text"
e.Row.Cells(5).Controls.Add(MyLabel)
Dim MyTextBox As New TextBox
MyTextBox.ID = "Textbox1"
MyTextBox.Text = "Text box value"
e.Row.Cells(6).Controls.Add(MyTextBox)
End If
End Sub
然后在item bound事件上,您还可以按如下方式注入您选择的控件:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
<asp:TemplateField HeaderText = "My label">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "My Text Box">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim MyLabel As New Label
MyLabel.ID = "Label1"
MyLabel.Text = "Label Text"
e.Row.Cells(5).Controls.Add(MyLabel)
Dim MyTextBox As New TextBox
MyTextBox.ID = "Textbox1"
MyTextBox.Text = "Text box value"
e.Row.Cells(6).Controls.Add(MyTextBox)
End If
End Sub
现在,使用这个简单的标记:
<link href="Content/cuscosky.css" rel="stylesheet" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
</Columns>
</asp:GridView>
编辑:
我通过在标记中创建一个HTML表来解决这个问题,然后通过编程方式添加带有控件(标签和文本框)和唯一ID的行和单元格。然后,我能够找到并用正确的数据填充这些控件。
这比手动定位每个控件容易得多
我能够解决控制装置的定位问题。
我需要使用label.Style.Add()
并输入所需的值。
它现在似乎工作正常
谢谢!您使用的是哪种UI框架?WinForms/WPF/等等?以及[html]与这个问题有什么关系?对不起,这是一个aspx Web表单。面板是用html构建的,我不确定这是否正确
<link href="Content/cuscosky.css" rel="stylesheet" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
</Columns>
</asp:GridView>