在Windows窗体中,我可以通过执行以下操作动态添加控件:
for (int i = 0; i < 5; i++)
{
Button button = new Button();
button.Location = new Point(160, 30 * i + 10);
button.Tag = i;
this.Controls.Add(button);
}
Run Code Online (Sandbox Code Playgroud)
如何动态添加控件FlowLayoutPanel?
我在Windows窗体的面板上动态生成控件,我还生成了一个用于删除控件的按钮,所有控件都在行中.
int c = 0;
private void button1_Click(object sender, EventArgs e)
{
int v;
v = c++;
panel1.VerticalScroll.Value = VerticalScroll.Minimum;
ComboBox combo = new ComboBox();
combo.Name = "combobox" + v ;
combo.Location = new Point(30, 5 + (30 * v));
ComboBox combo2 = new ComboBox();
combo2.Name = "combobox2" + v ;
combo2.Location = new Point(170, 5 + (30 * v));
TextBox txt = new TextBox();
txt.Name = "txtbx" + v;
txt.Location = new Point(300, 5 + (30 * v));
TextBox …Run Code Online (Sandbox Code Playgroud) 我在winforms中有一个flowlayout控件,我已将其流向设置为TopDown,但它从左到右依次添加控件,autoscroll也设置为true.
flowLayoutPanel1.Controls.Clear();
Label labelInput = new Label();
ListBox listBoxNewInput = new ListBox();
//Initialize label's property
labelInput.Text = " #" + Convert.ToInt32(sequence);
labelInput.AutoSize = true;
//Initialize textBoxes Property
listBoxNewInput.HorizontalScrollbar = false;
listBoxNewInput.Items.Add(efforts);
//Add the newly created text box to the list of input text boxes
inputTextBoxesList.Add(listBoxNewInput);
//Add the labels and text box to the form
flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
flowLayoutPanel1.Controls.Add(labelInput);
flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
flowLayoutPanel1.Controls.Add(listBoxNewInput);
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个网页,该网页将根据下拉列表的选定值显示适当的用户控件.
基本上页面布局是这样的:
下拉选择
< 基于下拉选择创建的用户控制 >
我有一半工作...当选择改变时控件正在改变.在OnInit()中,我动态创建最后选择的控件(其值以会话状态保存,因为ViewIn在OnInit中不可用).
当发生下拉选择更改时,我删除旧的用户控件,并添加一个新的用户控件. 问题是:从选择更改事件添加新控件后,我无法在第一次回发时保存用户的更改.在第一个回发后,从OnInit而不是Change事件创建所选控件,然后保存状态,直到下一个选择更改.
这是SelectionChanged方法:
protected void SelectionChanged(object sender, EventArgs e)
{
SelectedValue = int.Parse(DropDownList.SelectedValue); //Store in Session
Control userControl = GetSpecificUserControl(SelectedValue);
PlaceHolder1.Controls.Clear(); // Remove old user control
PlaceHolder1.Controls.Add(userControl);
}
Run Code Online (Sandbox Code Playgroud)
在SelectionChanged发生后,用户对新控件所做的任何更改都不会保存在以下帖子中.但是,随后的回发会得到保存.此时,控件将在OnInit()中创建.
当控件发生变化时,是否有某种方法可以强制正确的回发和ViewState?控件更改后是否可以强制页面重新初始化?
我想创建控件,允许用户设计自己的网站结构.我想象里面UpdatePanel是控件(TextBox用于页面名称)和Button'添加到下面'.它看起来像:
| "Questions" |
| [ add below ] |
| "Tags" |
| [ add below ] |
| "Badges" |
| [ add below ] |
Run Code Online (Sandbox Code Playgroud)
现在当用户点击"标签"元素中的按钮时,应该在"标签"和"徽章"之间出现新的,具有可编辑的名称,因此用户可以将其命名为"用户".它应该在没有完全回发的情况下完成(以避免页面闪烁).
现在是我的问题:我无法加载onInit中的那些控件(最后不是全部)因为它们不存在,但我必须关注它们的click事件,所以我应该附加事件监听器在Init阶段应该做什么.如何实现所描述的功能?
我玩了太多时间,我很困惑.我会很感激任何提示.
我正在开发一个ASP.NET VB.NET Web表单 - 一个预订Web应用程序,其中只有一个aspx页面和其余部分是用户控制页面.
在aspx页面的运行时,用户控件按步骤加载,名称在db中定义,如下面的链接.
在第一步中,第一个用户控件是在page-init中绑定,用于显示.NET datalist控件中的预留可用性详细信息(参见图像).

绑定所有细节以通过data-list的item_databound事件生成运行时控件.

Now issue is whenever any event of datalist(click on romm-image or dropdown selected index changed) fired, the dynamic control remove …
研究ASP.NET 4.5 WebForms中新的强类型,模型绑定方法:
在Scott Hanselman的 WebForms模型绑定示例(以及其他)中,我看到使用在"编辑"模式下打开的FormView,其中包含一些DynamicControls 例如
<asp:FormView runat="server" ID="MyForm" ... DefaultMode="Edit">
<EditItemTemplate>
<asp:DynamicControl runat="server" ID="Field1" DataField="Field1" Mode="Edit" />
<asp:DynamicControl runat="server" ID="Field2" DataField="Field2" Mode="Edit" />
</EditItemTemplate>
</asp:FormView>
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我的FormView ItemTemplate,EditItemTemplate并且InsertItemTemplate将是相同的,除了ItemTemplate的控件将处于"ReadOnly"模式.
我(仍)确实需要在FormView中提供三个几乎完全相同的模板副本吗?
我很高兴使用DynamicControls,但是这里的团队永远不会采用FormView所需的"3x复制粘贴"方法,特别是对于我们的大型模板.
我原以为可能:
任何例子/想法?
这是我的第一篇文章!我非常绝望,所以我超越了标准的谷歌搜索.我相信这是一个高级或专家级的.NET问题.
问题是我构建了一个.NET Web应用程序,它需要能够动态地将用户控件插入到列表中间.我对动态控件非常熟悉这么长时间他们只需要添加到列表的末尾(即:我熟悉这样的文章:http://msdn.microsoft.com/en-us/library/ ms972976.aspx).但是,如果我需要将一个UserControl添加到Controls集合的前面或中间的某个地方,那么由于控件的UniqueID被抛弃,我几乎丢失了.
作为一个简化的例子,假设我有一个Panel,我正在添加一个名为MyControl.ascx的UserControl列表.我还有一些事件可以在页面上触发,需要动态地将MyControl.ascx插入到面板的Controls集合的指定索引中.我还需要在MyControl.ascx上有一个或多个事件我需要订阅.这意味着需要在这些控件上的事件触发之前加载控件,否则它们将不会触发.如果你不知道我所指的是什么,那么我要么说问题不好,要么这个问题可能对你来说太难了:)
下面是一些C#伪代码来演示这个问题.问题是Controls.AddAt(索引,控制)方法不会相应地调整控件的UniqueID值.例如,请考虑Controls集合中的以下控件:
无论我是否实际编写直接依赖于UniqueID的代码,.NET间接使用UniqueID将在先前回发上触发的事件链接在一起,并在新的回发上加载控件.以前面的例子为例:
在最初 Page Load (Page.IsPostback == false)
<table>
<tr>
<td width='100'>Control index</td>
<td width='75'>UniqueID</td>
<td>Value</td>
</tr>
<tr>
<td>0</td>
<td>ctl00</td>
<td>value1</td>
</tr>
<tr>
<td>1</td>
<td>ctl01</td>
<td>value2</td>
</tr>
<tr>
<td>2</td>
<td>ctl02</td>
<td>value3</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
在Page.IsPostback == false某个其他控件想要在索引0处插入控件的回发()之后:
如果我这样做,Controls.AddAt(0, newControl)那么Controls集合看起来像这样:
<table>
<tr>
<td width='100'>Control index</td>
<td width='75'>UniqueID</td>
<td>Value</td>
</tr>
<tr>
<td>0</td>
<td>ctl03</td>
<td>value0 <== the controls' unique IDs do not shift!</td>
</tr>
<tr>
<td>1</td>
<td>ctl00</td>
<td>value1</td>
</tr>
<tr>
<td>2</td> …Run Code Online (Sandbox Code Playgroud) 假设我有一个树视图,其中每个树节点包含一组不同用户控件的 id。当用户点击一个节点时,这些控件应该被加载到页面中。据我了解 ASP 页面生命周期,应在初始化阶段添加动态控件,稍后将触发回发事件。
那么如果在我需要添加控件之后发生treeview点击事件,我该如何根据用户回发事件动态添加控件呢?
编辑:我尝试了 ArronLS 的建议:
我所做的是将节点值添加到会话数组中,并在我执行 init 时使用它来选择要加载到占位符控件的控件的表单元素。在 treeview 单击事件中,我更新会话数组中的节点,清除占位符中的旧表单元素,并将新表单元素添加到控件中。当页面再次加载时,它现在应该在初始化时找到节点,这样就可以避免视图状态问题。
现在我还没有完全测试这个,但是还有另一个类似的帖子讨论了视图状态可能导致的问题。他们提出了一个解决方案,在 Init 控件中轮询上下文的 Request[] 部分(在他们的情况下是 dropbox),手动处理一些回发功能。
我的新问题是如何使用请求数组访问树视图中的选定节点?
考虑一下 -
我允许最终用户通过获取一些细节在ASP.Net页面中动态创建选项卡控件.对于添加的每个标签,我都会得到一些设置 -
所以我得到每个标签的这些细节.用户向另外一个选项卡提供了一个"添加标签"按钮.因此,我需要在页面中添加一个标签设置面板以获取标签设置.但是这样做,我丢失了先前创建的动态标签设置面板中输入的值.用户可以添加任意数量的选项卡,并为每个选项卡输入设置.最后,当他们保存它时,我构建了tab控件(基于他们的设置和内容),然后我渲染控件.
由于控件是动态的,我可以选择两种方式 -
有关如何更好地做到这一点的任何见解?
dynamic-controls ×10
asp.net ×7
c# ×6
winforms ×3
asp.net-4.5 ×1
datalist ×1
panel ×1
vb.net ×1
webforms ×1