我在C#网络表单上有一个用户控件。 Control由另一个Activex控件组成。用户控件正在动态添加到表单中。我为每个动态添加的用户控件实例添加了一个双击事件。然而双击甚至没有被解雇。以下是我的代码
int a = 0;
int b = 0;
int i, j;
int[,] Matrica;
Matrica = new int[n, m];
for (i = 0; i < n; i++)
{
a = merlokacionin.X + 5;
for (j = 0; j < m; j++)
{
textbox[i, j] = new UserCont();
textbox[i, j].Location = new Point(a, b)
panel3.Controls.Add(textbox[i, j])
textbox[i, j].DoubleClick += new System.EventHandler(dicom_DoubleClick);
a = a + 105;
}
b = b + 105;
}
private void dicom_DoubleClick(object sender, System.EventArgs e)
{
MessageBox.Show("do something here");
}
//I have also tried;
int a = 0;
int b = 0;
int i, j;
int[,] Matrica;
Matrica = new int[n, m];
for (i = 0; i < n; i++)
{
a = merlokacionin.X + 5;
for (j = 0; j < m; j++)
{
textbox[i, j] = new UserCont();
textbox[i, j].Location = new Point(a, b)
panel3.Controls.Add(textbox[i, j])
textbox[i, j].DoubleClick += new System.EventHandler(dicom_DoubleClick);
a = a + 105;
}
b = b + 105;
}
private void dicom_DoubleClick(object sender, System.EventArgs e)
{
MessageBox.Show("do something here");
}
我甚至尝试在用户控件本身中添加双击单击事件,甚至没有被触发。
对此的任何帮助都非常感谢。
答案 0 :(得分:0)
在处理动态创建的控件时,必须重新添加控件不迟到而不是body
方法。否则,事件处理程序将不会“重新连接”,也不会为控件恢复视图状态。
在Page_Load
期间重新创建控件是页面生命周期中的“正确”位置。虽然最终结果是相同的,但在OnInit
期间重新创建控件会强制页面“追赶”。
如果您可以从您的页面提供相关代码,我可以为您提供实施。否则,只需重新创建动态控件,如上所述。
编辑
还有什么可以用来启动事件吗?
简短回答?不,没有。您受asp.net页面生命周期的约束。如果您没有重新创建上述控件,您将无法连接按钮的单击事件。
这里的技巧是跟踪您动态创建的控件,以便能够在Page_Load
期间恢复它们。您可以使用ViewState执行此操作。在按钮单击事件上添加控件时,将重新创建控件所需的信息添加到页面的视图状态中。
可以在此处找到关于这些原则的良好讨论:Manage Dynamically Created Controls - Take advantage of automatic state maintenance for dynamic controls.
要跟踪动态创建的控件,必须使用持久数据存储,例如视图状态。您可以使用的一个简单技巧包括在创建动态控件时向页面的视图状态添加一些信息。您添加到视图状态的语法和语义完全取决于您。