RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1251820
Accepted
Shamus Rezol
Shamus Rezol
Asked:2022-03-05 11:01:34 +0000 UTC2022-03-05 11:01:34 +0000 UTC 2022-03-05 11:01:34 +0000 UTC

如何删除控制事件处理程序的代码重复?

  • 772

再会。

我寻求帮助以制服我内心的完美主义者。他对我复制代码感到愤慨。现在我来解释一下。

在窗体上,我在一个函数中动态创建了三个控件Panel:PictureBox和Label。最后两个指的是刚刚创建为子控件的第一个控件。

private void ConstructUser(int uidx, string name, string avatar_path);

在单击这些控件中的任何一个时,我想执行一些使用局部变量uidx和name. 除了使用 lambda 事件处理程序之外,我想不出任何其他实现:

Panel ctrl = new Panel();
// ...
ctrl.MouseClick += (sender, e) =>
{
    if (e.Button == MouseButtons.Left)
    {
        ShowUserInfo(uidx, name); // ShowUserInfo - еще одна функция формы.
    }
};

这就是问题。该事件仅在我单击面板时触发ctrl(小于总可点击区域覆盖率的 5%;95% 被子控件占用)。

  • 我无法告诉面板的子控件ctrl我想在元素MouseClick的处理程序中接收它们的事件。MouseClickctrl
  • 我不能将表单函数用作处理程序,因为我需要访问局部变量uidx和name,它们只存在于创建函数的上下文中ConstructUser。
  • 我无法ctrl将我的附加数据添加到面板中,该面板将包含局部变量uidx并name使用表单函数。我认为编写类包装器Panel是荒谬的。我确信他Panel有这样的机会,但我什至还没有意识到。
  • 我无法将 lambda 函数创建为变量。这里对c#的影响已经很小了。Lambda 函数作为变量,必然需要返回值。他不在这儿。

结果,我不得不为我创建的所有控件复制处理程序代码。

ctrl.MouseClick += (sender, e) =>
{
    if (e.Button == MouseButtons.Left)
    {
        ShowUserInfo(uidx, name);
    }
};
_myPictureBox1.MouseClick += (sender, e) =>
{
    if (e.Button == MouseButtons.Left)
    {
        ShowUserInfo(uidx, name);
    }
};
_myLabel1.MouseClick += (sender, e) =>
{
    if (e.Button == MouseButtons.Left)
    {
        ShowUserInfo(uidx, name);
    }
};

我现在不怕这个了:重复三行代码三次。未来会发生什么?然后我会得到你的答案。

我很想看到上面列出的任何或每个点的解决方案的答案。他们中的任何一个都解决了我的问题,而且越多 - 我选择的软件解决方案就越多变。

感谢您的关注。

附件 A

以上所有内容都足以回答,但我将从主表单中给出此处特色功能的代码Form1。这是为了以防你想完全重复我的情况。

private void ShowUserInfo(int uidx, string name)
{
    Form2 _ = new Form2(uidx, name); // Ошибка? Можете просто удалить тело этой функции.
    _.Show();
}

private int offset = 0; // px; c++ like static local variable...
private void ConstructUser(int uidx, string name, string avatar_path)
{
    // CONTROLS:
    int cx_w = SystemInformation.FixedFrameBorderSize.Width * 2 + SystemInformation.VerticalScrollBarWidth;

    Panel ctrl       = new Panel();
    ctrl.Parent      = panel1; // Ошибка? Обязан быть. Не забудьте свойство AutoScroll = true.
    ctrl.BorderStyle = BorderStyle.FixedSingle;
    ctrl.Location    = new Point(0, offset);
    ctrl.Size        = new Size(ctrl.Parent.Width - cx_w, 64);
    ctrl.Font        = ctrl.Parent.Font;
    ctrl.Parent.Controls.Add(ctrl);

    offset += ctrl.Size.Height + 12; // h + padding

    PictureBox avatar  = new PictureBox();
    avatar.Parent      = ctrl;
    avatar.BorderStyle = BorderStyle.None;
    avatar.Location    = new Point(0, 0);
    avatar.SizeMode    = PictureBoxSizeMode.StretchImage;
    avatar.Size        = new Size(64, 64);
    avatar.Image       = Image.FromFile(avatar_path);
    avatar.Parent.Controls.Add(avatar);

    Label nm     = new Label();
    nm.Parent    = ctrl;
    nm.TextAlign = ContentAlignment.MiddleLeft;
    nm.Location  = new Point(avatar.Size.Width + 6, 0);
    nm.Size      = new Size(nm.Parent.Width - avatar.Width - 12 - SystemInformation.BorderSize.Width * 2, nm.Parent.Height);
    nm.Font      = nm.Parent.Font;
    nm.Text      = name;
    nm.Parent.Controls.Add(nm);

    // COLORS:
    avatar.BackColor = Color.Bisque;
    ctrl.BackColor   = Color.Coral;
    nm.BackColor     = Color.Silver;

    // EVENTS:
    ctrl.MouseClick += (sender, e) =>
    {
        if (e.Button == MouseButtons.Left)
        {
            ShowUserInfo(uidx, name);
        }
    };
    avatar.MouseClick += (sender, e) =>
    {
        if (e.Button == MouseButtons.Left)
        {
            ShowUserInfo(uidx, name);
        }
    };
    nm.MouseClick += (sender, e) =>
    {
        if (e.Button == MouseButtons.Left)
        {
            ShowUserInfo(uidx, name);
        }
    };
}
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    tym32167
    2022-03-05T11:45:43Z2022-03-05T11:45:43Z

    具有局部功能的变体

    void myHandler (object sender, MouseEventArgs e) 
    {
        if (e.Button == MouseButtons.Left)
        {
            ShowUserInfo(uidx, name);
        }
    };
    
    // EVENTS:
    ctrl.MouseClick += myHandler;
    avatar.MouseClick += myHandler;
    nm.MouseClick += myHandler;
    

    带有 lambda 的变体

    var myHandler = new MouseEventHandler((object sender, MouseEventArgs e)=>
    {
        if (e.Button == MouseButtons.Left)
        {
            ShowUserInfo(uidx, name);
        }
    });
    
    // EVENTS:
    ctrl.MouseClick += myHandler;
    avatar.MouseClick += myHandler;
    nm.MouseClick += myHandler;
    
    • 3

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5