业余新手提问:10个相同事件操作的事件能怎么写在一起?

byrontian 2018-02-28 11:23:31


怎么解决这些重复的代码啊?
...全文
802 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
无情时尚 2018-03-01
  • 打赏
  • 举报
回复
自己写的一个三句话实现简单计算器 http://blog.csdn.net/yuhijk2055/article/details/78766312
  • 打赏
  • 举报
回复
“相同(相类似)代码只写一次,然后复用”这个原则有很多种不同的编码模式。其中,“如何抽象”是个关键,这通过你的描述为你的术语能看出来。
  • 打赏
  • 举报
回复
所有代码的“差别”就在于两个控件是可变参数,然后提取为一个通用的业务处理方法。 而看 lz 的“相同事件操作写在一起”的说法,显然没有学到设计模式。而不仅仅是代码。
xuzuning 2018-02-28
  • 打赏
  • 举报
回复
zN 是什么?这才是关键
  • 打赏
  • 举报
回复
发的慢了,楼上都说
  • 打赏
  • 举报
回复
只写一个事件方法,把需要执行该事件方法的控件都绑定注册一下,如1楼版主发的 不过楼主你这个如果不是相等就是红的,那一开始输入个值就是红色的,然后就会一直是红的了。。。还要加else吧 textBox12.ForeColor = Color.Black;
58662877 2018-02-28
  • 打赏
  • 举报
回复
10个控件的事件绑定到同一个过程,sender就是当前出触发事件的控件。后面你懂的。
  • 打赏
  • 举报
回复
主要是你理解的编程模式,你说的“写在一起”这个本身不是一个学过的模式。 如果只写一遍代码,那么需要高一个编程层级。例如
void 注册监听(TextBox txt1,  TextBox txt2)
{
    txt1.TextChanged += (s, e) =>
    {
        if (txt1.Text == txt2.Text)
            txt1.ForeColor = System.Drawing.Color.Red;
        else
            txt1.ForeColor = System.Drawing.Color.Black;
    };
}
这样就能少写代码。 “学过之后”你千万不要再说什么“写在一起”。这就好像是堆石头跟建筑设计的区别,是有着本质的区别的。
  • 打赏
  • 举报
回复
zXX我这里假设是TextBox,如果不是自行调整
  • 打赏
  • 举报
回复
            var tb = sender as TextBox;
            if (tb != null)
            {
                var compare = this.Controls.Find("z" + Regex.Replace(tb.Name, @"\D", string.Empty), true);
                if (compare != null && compare.Length > 0 && compare[0] is TextBox)
                {
                    if (tb.Text == ((TextBox)compare[0]).Text)
                    {
                        tb.ForeColor = Color.Red;
                    }
                }
            }
你的id命名规则必须如你代码所写的那样一一对应
  • 打赏
  • 举报
回复
this.Controls.Find那块可以精准调整为包含的Control以减少查找范围,后面是否包含子控件设为false
  • 打赏
  • 举报
回复
你把这4个代码 copy 在一个方法里,不是也还是要重写一遍?
leon51 2018-02-28
  • 打赏
  • 举报
回复
楼上的都是大神
十二月的消亡 2018-02-28
  • 打赏
  • 举报
回复
switch语句啊
qq_36631861 2018-02-28
  • 打赏
  • 举报
回复
学习大牛的技术了
byrontian 2018-02-28
  • 打赏
  • 举报
回复
引用 12 楼 From_TaiWan 的回复:
哇,大家真快,上午就看到了,写了一点,就忙去了

class myText
{
    public TextBox t1;
    public TextBox t2;
    public myText(TextBox p_t1,TextBox p_t2)
    {
        t1 = p_t1;
        t2 = p_t2;
        t1.TextChanged += (s, e) =>
            {
                if (t1.Text == t2.Text)
                {
                    t1.ForeColor = System.Drawing.Color.Red;
                }
                else
                {
                    t1.ForeColor = System.Drawing.Color.Black;
                }
            };
    }
}

private void Form5_Load(object sender, EventArgs e)
{
    myText[] theText = { new myText(textBox1,z1), new myText(textBox2,z2)};
    //do other things

}

需要窗体上有textBox1,textBox2;z1,z2 四个文本框
谢谢指点
byrontian 2018-02-28
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
            var tb = sender as TextBox;
            if (tb != null)
            {
                var compare = this.Controls.Find("z" + Regex.Replace(tb.Name, @"\D", string.Empty), true);
                if (compare != null && compare.Length > 0 && compare[0] is TextBox)
                {
                    if (tb.Text == ((TextBox)compare[0]).Text)
                    {
                        tb.ForeColor = Color.Red;
                    }
                }
            }
你的id命名规则必须如你代码所写的那样一一对应
谢谢指点
byrontian 2018-02-28
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
主要是你理解的编程模式,你说的“写在一起”这个本身不是一个学过的模式。 如果只写一遍代码,那么需要高一个编程层级。例如
void 注册监听(TextBox txt1,  TextBox txt2)
{
    txt1.TextChanged += (s, e) =>
    {
        if (txt1.Text == txt2.Text)
            txt1.ForeColor = System.Drawing.Color.Red;
        else
            txt1.ForeColor = System.Drawing.Color.Black;
    };
}
这样就能少写代码。 “学过之后”你千万不要再说什么“写在一起”。这就好像是堆石头跟建筑设计的区别,是有着本质的区别的。
谢谢指点。没有学过,所以不是太懂,这里论文要用到所以赶着做了一个,
SoulRed 2018-02-28
  • 打赏
  • 举报
回复
抽象出一个接口,定义接口变量,实例化实体类。这样就可以了
bloodish 2018-02-28
  • 打赏
  • 举报
回复
如果textbox之间是确定性的对应关系,就用Dictionary预先确定保存一一对应的关系,这样可以避免查询,提高可读性

       TextBox textbox1, textbox2;
        TextBox tb1, tb2;
        Dictionary<TextBox, TextBox> TextBoxMap { get; set; }

        private void Initialize()
        {
            TextBoxMap = new Dictionary<TextBox, TextBox>()
            {
                {textbox1,tb1 },{textbox2,tb2}
            };

            TextBoxMap.Keys.ToList().ForEach(tb => tb.TextChanged += (s, e) =>
            {
                if (s is TextBox t1 && TextBoxMap.TryGetValue(t1, out TextBox t2))
                {
                    t1.ForeColor = t1.Text == t2.Text ? Color.Red : Color.Black;
                }
            });
        }
加载更多回复(2)

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧