在 C# WinForm 中单击 PictureBox 时将列表 <Object> 传递给单击处理程序

Passing a List<Object> to the Click Handler when clicking PicutreBox in C# WinForm

我正在尝试编写一个 WinForm 应用程序来跟踪我的照片、照片的发布位置以及照片中的人物。我已经用这些信息创建了一个 SQL 后端数据库。我创建了一个模型(不编程的人)class 来构造对象,然后我创建了一个连接 class 连接到数据库并执行查询并创建一个列表,其中的值来自分贝。

我能够在流程面板布局中生成一组图像,循环访问并抓取照片。从 Form1_Load 的同一部分,我可以将列表中的每个元素输出到控制台。我遇到的问题是将这些值传递给 PictureBox1_Click 处理程序。我可以获得 URL 没问题,因为它是 PictureBox 对象的一部分,但我无法弄清楚如何获取与我单击发送的给定照片相关联的整个模型对象。目的是当我点击一张照片时,我在布局中的文本标签应该使用数据库中的名称、位置、日期等值填充。

我试过将整个列表传递给点击处理程序但失败了,我试过从加载事件重载以传递给点击事件,这让我在图片框上出现了投射错误。

    private void PictureBox1_Click(object sender, EventArgs e)
    {
        PictureBox p = (PictureBox)sender;


        string j = p.ImageLocation;
        MfNameTxt.Text = "Chris";
        MessageBox.Show("Clicked! " + j);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        daoConn dc = new daoConn();
        List<Model> models = new List<Model>();
        string url;
        string fName;
        models = dc.GetAllModels();


        foreach (Model m in models)
        {
            int tempValue;
            tempValue = 1;
            PictureBox pb = new PictureBox();
            url = baseUrl + m.MhsUrl;
            fName = m.mFirstName;
            Size size = new Size(100, 100);
            pb.ImageLocation = url;
            pb.Size = size;
            pb.Click += new EventHandler(PictureBox1_Click);
            pb.SizeMode = PictureBoxSizeMode.Zoom;
            modelHsFlowLayout.Controls.Add(pb);
        }

    }

当我尝试 pb.Click += new EventHandler((s, e1) => this.PictureBox1_Click(sender, e, tempValue));只是为了发送一个临时值并证明我可以在那里传递一些东西我得到了案例错误:Message=Unable to cast object of type '_pictures_v2.Form1' to type 'System.Windows.Forms.PictureBox'.

因为在示例代码中,sender是通过sender而不是通过s。另外你应该传入 e1 而不是 e.

这将给出以下代码:

pb.Click += new EventHandler((s, e1) => this.PictureBox1_Click(s, e1, tempValue))

您还可以使用闭包,而不是将您的点击处理代码提取到一个单独的函数中,它可以全部内联完成。

例如:

private void Form1_Load(object sender, EventArgs e)
    {

        daoConn dc = new daoConn();
        List<Model> models = new List<Model>();
        string url;
        string fName;
        models = dc.GetAllModels();


        foreach (Model m in models)
        {
            int tempValue;
            tempValue = 1;
            PictureBox pb = new PictureBox();
            url = baseUrl + m.MhsUrl;
            fName = m.mFirstName;
            Size size = new Size(100, 100);
            pb.ImageLocation = url;
            pb.Size = size;
            pb.Click += (s,clickEvent) => {
                // You can use of pb directly here
                // You also have access to things like models too.
                string j = pb.ImageLocation;
                MfNameTxt.Text = "Chris";
                MessageBox.Show("Clicked! " + j);
            };
            pb.SizeMode = PictureBoxSizeMode.Zoom;
            modelHsFlowLayout.Controls.Add(pb);
        }
    }