Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使动态添加的按钮可单击_C#_.net_Winforms - Fatal编程技术网

C# 如何使动态添加的按钮可单击

C# 如何使动态添加的按钮可单击,c#,.net,winforms,C#,.net,Winforms,我正在创建一个C#应用程序,它从数据库中获取数据,并在一行中动态创建5个文本框和一个按钮 数据库中的行数等于创建的文本框和按钮的行数 我可以成功地创建文本框和按钮行,这些文本框甚至能够显示从数据库中提取的数据 但是,我的问题是,生成的按钮在单击时不会执行任何操作,这并非意外,因为我尚未创建处理单击事件的处理程序。但我对如何为再次动态生成的按钮动态创建点击平衡处理程序感到困惑 下面是生成文本框和按钮的代码示例 for (int i = 3; i <= count; i++) { co

我正在创建一个C#应用程序,它从数据库中获取数据,并在一行中动态创建5个文本框和一个按钮

数据库中的行数等于创建的文本框和按钮的行数

我可以成功地创建文本框和按钮行,这些文本框甚至能够显示从数据库中提取的数据

但是,我的问题是,生成的按钮在单击时不会执行任何操作,这并非意外,因为我尚未创建处理单击事件的处理程序。但我对如何为再次动态生成的按钮动态创建点击平衡处理程序感到困惑

下面是生成文本框和按钮的代码示例

for (int i = 3; i <= count; i++)
{
    com.Parameters[0].Value = i;
    using (SqlCeDataReader rd = com.ExecuteReader())
    if (rd.Read())
    {
        pname = (rd["pname"].ToString());
        cname = (rd["cname"].ToString());
        budget = (rd["budget"].ToString());
        advance = (rd["advance"].ToString());
        ddate = (rd["ddate"].ToString());

        TextBox tobj = new TextBox();
        tobj.Location = new Point(10, (40 + ((i - 2) * 20)));
        tobj.Tag = 1;
        tobj.Text = pname;
        tobj.AutoSize = false;
        tobj.Width = 150;
        tobj.ReadOnly = true;
        this.Controls.Add(tobj);

        TextBox tobj1 = new TextBox();
        tobj1.Location = new Point(160, (40 + ((i - 2) * 20)));
        tobj1.Tag = 2;
        tobj1.Text = cname;
        tobj1.AutoSize = false;
        tobj1.Width = 150;
        tobj1.ReadOnly = true;
        this.Controls.Add(tobj1);

        TextBox tobj2 = new TextBox();
        tobj2.Location = new Point(310, (40 + ((i - 2) * 20)));
        tobj2.Tag = 3;
        tobj2.Text = budget;
        tobj2.AutoSize = false;
        tobj2.Width = 100;
        tobj2.ReadOnly = true;
        this.Controls.Add(tobj2);

        TextBox tobj3 = new TextBox();
        tobj3.Location = new Point(410, (40 + ((i - 2) * 20)));
        tobj3.Tag = 4;
        tobj3.Text = advance;
        tobj3.AutoSize = false;
        tobj3.Width = 100;
        tobj3.ReadOnly = true;
        this.Controls.Add(tobj3);

        TextBox tobj4 = new TextBox();
        tobj4.Location = new Point(510, (40 + ((i - 2) * 20)));
        tobj4.Tag = 5;
        tobj4.Text = ddate;
        tobj4.AutoSize = false;
        tobj4.Width = 100;
        tobj4.ReadOnly = true;

        int due = 0;
        due = int.Parse(ddate);
        if (due < 5)
        {
             tobj4.BackColor = System.Drawing.Color.Red;
        }

        this.Controls.Add(tobj4);

        Button button = new Button();
        button.Left = 620;
        button.Tag = i;
        button.Height = 20;
        button.Text = "Details";
        button.Top = (40 + ((i - 2) * 20));
        this.Controls.Add(button);  
    }
}

对于(int i=3;i您需要订阅
单击
事件:

button.Click += ... some event handler ...
您可以使用处理程序的方法:

button.Click += MyEventHandlerMethod;

// put this method somewhere in your Form class
void MyEventHandlerMethod( object sender, EventArgs args )
{
  ...
甚至是一只羔羊:

button.Click += ( s, e ) => HandleClick( ... any parameters here ... );

// put this method somewhere in your Form class
void HandleClick( ... required parameters ... )
{
  ...

作为提示,您可以查看正常形式的
.designer.cs
文件以查看如何完成操作。

您需要订阅
单击
事件:

button.Click += ... some event handler ...
您可以使用处理程序的方法:

button.Click += MyEventHandlerMethod;

// put this method somewhere in your Form class
void MyEventHandlerMethod( object sender, EventArgs args )
{
  ...
甚至是一只羔羊:

button.Click += ( s, e ) => HandleClick( ... any parameters here ... );

// put this method somewhere in your Form class
void HandleClick( ... required parameters ... )
{
  ...
作为提示,您可以查看正常形式的
.designer.cs
文件,了解如何完成操作。

回答部分:

添加以下内容:

button.Tag = i;
button.Click += handleTheClick;

...

private void handleTheClick(object sender, EventArgs e){
    Button btn = sender as Button;
    int row = (int)btn.Tag;
}
联合国答复:

您应该重新考虑您的设计。在2013年,在数据处理代码中包含坐标是一个非常糟糕的主意,请尝试使用ListView、ListBox、GridView或更好的-切换到WPF。

答案部分:

添加以下内容:

button.Tag = i;
button.Click += handleTheClick;

...

private void handleTheClick(object sender, EventArgs e){
    Button btn = sender as Button;
    int row = (int)btn.Tag;
}
联合国答复:


您应该重新考虑您的设计。在2013年,在数据处理代码中包含坐标是一个非常糟糕的主意,尝试使用ListView、ListBox、GridView或更好的方法-切换到WPF。

为什么这个问题被标记为
sql server
?因为应用程序正在从sql server获取数据,而我在使用后来证明是由于错误的sql查询引发异常引起的。@RickRoy按钮单击与sql server有什么关系?为什么这个问题被标记为
sql server
?因为应用程序正在从sql server获取数据,我在控件方面遇到了类似的问题,后来证明是由于异常引起的n由于错误的sql查询而被抛出。@RickRoy button click与sql server有什么关系?这里的tobj指的是文本框es,它们没有click方法。另外,如果“lambda”只是将处理重定向到其他地方,它也不是真正的lambda,是吗?lambda的好处是可以使row对象保持活动状态(尽管这可能是内存泄漏,但请谨慎使用)@StenPerov oops-现在改为
按钮
。使用lambda的优点是可以关闭局部变量并将其作为参数传递。此外,处理程序方法不必有
事件处理程序
签名。tobj这里指的是文本框,它们没有单击方法。还有“lambda”如果lambda只是将处理重定向到其他位置,那么它就不是真正的lambda了,是吗?lambda的好处是可以使row对象保持活动状态(尽管这会导致内存泄漏,所以请谨慎使用)@StenPerov oops-现在改为
按钮
。使用lambda的优点是可以关闭局部变量并将其作为参数传递。此外,处理程序方法不必有
事件处理程序
签名。谢谢,这很有效。我将改进@Sten Petrov的设计,但我是C#新手,所以请尝试一下。谢谢谢谢你的帮助:)@RickRoy我知道你是新来的,没有更好的时间开始学习“新”东西而不是学习历史技术。你不会开始学习BASIC或Fortran,是吗?谢谢,这很有效。我会改进我的设计@Sten Petrov,但我对C#是新来的,所以就试试吧。谢谢你的帮助:)@RickRoy我知道你是新来的,没有更好的时间开始学习“新”事物而不是学习历史技术。你不会开始学习BASIC或Fortran,是吗?