【问题标题】:How to get specific information about an automatically generated button from a click event如何从单击事件中获取有关自动生成的按钮的特定信息
【发布时间】:2015-04-17 04:53:16
【问题描述】:

在这种方法中,按钮会根据 sql 查询显示的结果数量自动生成到流布局面板。然后将新按钮添加到事件处理程序以实现功能。我的问题是,我想获取特定于我单击的按钮的信息。分配给按钮的信息是 clientName、projectType,并且在后台,包括属性 clientNo 和 projectNo 是为了参照完整性。我需要的是单击按钮时分配给该按钮的值。

目前,该方法只返回最后创建的按钮。

private string AddButton()
        {

            string sql = "SELECT projectType, clientName, projectNo, Client.clientNo FROM Project, Client WHERE Project.ClientNo = Client.ClientNo;";

            newConnection = new ConnectToDatabase(sql);

            dataReader = newConnection.NewDataReader();

            while (dataReader.Read())
            {
                newButton = new Button();
                newButton.Font = new Font("Georgia", 12);
                newButton.Size = new Size(194, 80);
                newButton.Name = dataReader.GetValue(3).ToString();
                newButton.Text = dataReader.GetValue(1).ToString() + "\n" + dataReader.GetValue(0);
                flpDisplayProjects.Controls.Add(newButton);
                newButton.Click += new System.EventHandler(newButton_Click);
            }

            return newButton.Name;
        }

        void newButton_Click(object sender, EventArgs e)
        {
            string sql = "SELECT projectType, clientName, projectNo FROM Project, Client WHERE Project.ClientNo = Client.ClientNo AND " +
                "clientName = '" + newButton.Name + "';";

            newConnection = new ConnectToDatabase(sql);

            dataReader = newConnection.NewDataReader();

            timeTrackingForm newForm = new timeTrackingForm(dataReader);
            newForm.Show();
        }

【问题讨论】:

  • 我需要来自特定按钮的信息才能在 newButton_Click 方法中将信息添加到查询中,这样我就可以将该信息传递给不同的表单。

标签: c# event-handling datareader


【解决方案1】:

触发事件的按钮在sender 参数中可用...只需将其转换回:

void newButton_Click(object sender, EventArgs e)
{
    Button myButton = (Button)sender;

    // do whatever you want with myButton, not newButton

    ...

不要使用newButton,它只是对您创建的最后一个按钮的引用。实际上,无论创建这些按钮的方法如何,都应该在内部定义该变量。

【讨论】:

  • 就是这样。一行代码。去搞清楚。太感谢了!感谢您的及时回复。
【解决方案2】:

您可以使用 lambda 表达式来捕获 lambda 之外的任何值。

您的代码如下所示:

private string AddButton()
{
    string sql = "SELECT projectType, clientName, projectNo, Client.clientNo FROM Project, Client WHERE Project.ClientNo = Client.ClientNo;";
    newConnection = new ConnectToDatabase(sql);
    dataReader = newConnection.NewDataReader();
    while (dataReader.Read())
    {
        newButton = new Button();
        newButton.Font = new Font("Georgia", 12);
        newButton.Size = new Size(194, 80);
        newButton.Name = dataReader.GetValue(3).ToString();
        newButton.Text = dataReader.GetValue(1).ToString() + "\n" + dataReader.GetValue(0);
        flpDisplayProjects.Controls.Add(newButton);
        newButton.Click += (s, e) =>
        {
            string sql = "SELECT projectType, clientName, projectNo FROM Project, Client WHERE Project.ClientNo = Client.ClientNo AND " +
            "clientName = '" + newButton.Name + "';";
            newConnection = new ConnectToDatabase(sql);
            dataReader = newConnection.NewDataReader();
            timeTrackingForm newForm = new timeTrackingForm(dataReader);
            newForm.Show();
        };
    }
    return newButton.Name;
}

Click 处理程序内部对newButton 的引用与外部相同。

这也消除了创建 newButton_Click 方法的需要 - 这通常有利于封装功能。

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2023-03-04
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多