苏飞论坛

标题: 窗体继承的问题 [打印本页]

作者: johnson.sia    时间: 2013-6-14 15:05
标题: 窗体继承的问题
各位大侠,窗口继承后click事件为什么执行两次呢?在线狂等.........
作者: 站长苏飞    时间: 2013-6-14 15:09
应该是与继承无关吧,看下你的代码
作者: johnson.sia    时间: 2013-6-14 15:12
protected override void btnSubmit_Click(object sender, EventArgs e)
        {
            Add_TruckInfo();
        }
这是子窗体,click会执行两次

作者: 站长苏飞    时间: 2013-6-14 15:15
btnSubmit应该是在主窗体中也有吧,如果是这样你看看是不是在主窗体中也注册了一次事件btnSubmit_Click,如果是这样就会执行两次,
作者: johnson.sia    时间: 2013-6-14 15:33
是的,主窗体中也有这个按钮和Click事件,难道要改名
作者: johnson.sia    时间: 2013-6-14 15:42
狂等中................
作者: johnson.sia    时间: 2013-6-14 15:48
苏大侠,帮帮忙呗
作者: 站长苏飞    时间: 2013-6-14 16:02
johnson.sia 发表于 2013-6-14 15:42
狂等中................

你注册两次是肯定会执行两次的呀,这没办法,在子窗体中修改一下绑定的事件名称就行了
作者: johnson.sia    时间: 2013-6-14 16:03
好,谢谢
作者: 站长苏飞    时间: 2013-6-14 16:08
johnson.sia 发表于 2013-6-14 16:03
好,谢谢

你回复时单击我帖子下面的回复,不然我看不到通知,

你修改一下事件名字应该就行了,因为两个窗体绑定的事件名称相同,会出现这种情况
作者: johnson.sia    时间: 2013-6-14 16:11
站长苏飞 发表于 2013-6-14 16:02
你注册两次是肯定会执行两次的呀,这没办法,在子窗体中修改一下绑定的事件名称就行了

怎么没法动继承的方法,我把btnSubmit事件(和父类同名)删了,定义了一个btnAddSubmit事件,可是报错,执行的时候调用的父类中的方法,怎么这样呢
作者: 站长苏飞    时间: 2013-6-14 16:18
johnson.sia 发表于 2013-6-14 16:11
怎么没法动继承的方法,我把btnSubmit事件(和父类同名)删了,定义了一个btnAddSubmit事件,可是报错, ...

在子窗体中肯定没有办法修改主窗体的事件,只能重写,这个你网上找一下方法很多,
或者你在主窗体中不要处理事件,到子窗体再处理。就行了。
作者: johnson.sia    时间: 2013-6-14 16:40
站长苏飞 发表于 2013-6-14 16:18
在子窗体中肯定没有办法修改主窗体的事件,只能重写,这个你网上找一下方法很多,
或者你在主窗体中不要 ...

我使用的就是重写啊,父窗体事件定义成virtual,子窗体使用override重写事件
作者: 站长苏飞    时间: 2013-6-14 16:51
你贴一下代码看看
作者: johnson.sia    时间: 2013-6-14 16:55
站长苏飞 发表于 2013-6-14 16:51
你贴一下代码看看

父窗体:
           using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
namespace WinForms
{
    public partial class UpdateTruck : Form
    {
        public UpdateTruck()
        {
            InitializeComponent();
        }
        public List<TbTruck> list { get; set; }
        /// <summary>
        /// 定义属性保存选中的卡车信息
        /// </summary>
        public TbTruck tbTruck { get; set; }
        TbTruck t = new TbTruck();
        /// <summary>
        /// 更新卡车信息
        /// </summary>
        public void Update_TruckInfo()
        {
            t.Id = tbTruck.Id;
            t.Chpahaaa = this.txt_chpahaaa.Text.Trim();
            t.Chlisuyo = this.txt_chlisuyo.Text.Trim();
            t.Jifeduwe = this.txt_jifeauwe.Text.Trim();
            t.Chcuaaaa = this.txt_chcuaaaa.Text.Trim();
            t.Duweaaaa = this.txt_duweaaaa.Text.Trim();
            t.CrtUser = this.txt_crt_user.Text.Trim();
            //t.CrtDate = Convert.ToDateTime(this.txt_crt_date.Text.Trim());
            t.CrtDate = dtp_truck.Value;
            int count = TruckManage.Update(t);

            if (count > 0)
            {
                MessageBox.Show("修改成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }


        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label7_Click(object sender, EventArgs e)
        {

        }

        private  void btnSubmit_Click(object sender, EventArgs e)
        {
            Update_TruckInfo();
        }

        private  void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private  void StruckDetail_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                try
                {
                    TbTruck t = TruckManage.SelectOnTruckId(Convert.ToInt32(tbTruck.Id));
                    this.txt_chpahaaa.Text = t.Chpahaaa;
                    this.txt_chlisuyo.Text = t.Chlisuyo;
                    this.txt_jifeauwe.Text = t.Jifeduwe;
                    this.txt_chcuaaaa.Text = t.Chcuaaaa;
                    this.txt_duweaaaa.Text = t.Duweaaaa;
                    this.txt_crt_user.Text = t.CrtUser;
                    //this.txt_crt_date.Text = t.CrtDate.ToString();
                    dtp_truck.Value = t.CrtDate;
                    //UpdateTruck.
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
}



子窗体:
           using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
namespace WinForms
{
    public partial class AddTruck : UpdateTruck
    {
        public AddTruck()
        {
            InitializeComponent();
        }
        TbTruck t = new TbTruck();
        /// <summary>
        /// 添加卡车信息
        /// </summary>
        private void Add_TruckInfo()
        {
            t.Chpahaaa = this.txt_chpahaaa.Text.Trim();
            t.Chlisuyo = this.txt_chlisuyo.Text.Trim();
            t.Jifeduwe = this.txt_jifeauwe.Text.Trim();
            t.Chcuaaaa = this.txt_chcuaaaa.Text.Trim();
            t.Duweaaaa = this.txt_duweaaaa.Text.Trim();
            t.CrtUser = this.txt_crt_user.Text.Trim();
            //t.CrtDate = Convert.ToDateTime(this.txt_crt_date.Text.Trim());
            t.CrtDate = Convert.ToDateTime(dtp_truck.Value);
            int count = TruckManage.AddTruck(t);

            if (count > 0)
            {
                MessageBox.Show("修改成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        //protected override void btnSubmit_Click(object sender, EventArgs e)
        //{
        //    Add_TruckInfo();
        //}
        protected  void btnAddSubmit_Click(object sender, EventArgs e)
        {
            Add_TruckInfo();
        }

        protected  void btnAddCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        //protected override void btnCancel_Click(object sender, EventArgs e)
        //{
        //    this.Close();
        //}

        private void AddTruck_Load(object sender, EventArgs e)
        {

        }

    }
}
做了一点改动
作者: 站长苏飞    时间: 2013-6-14 16:59
johnson.sia 发表于 2013-6-14 16:55
父窗体:
           using System;
using System.Collections.Generic;

没见你在主窗体中设置virtual啊,你看我的代码
父窗体
[code=csharp]  public virtual void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("fd");
        }[/code]
子窗体
[code=csharp] public override void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("123");
        }[/code]
注意这个方法不是双击按钮出来的,而是直接写的,不能双击生成
这样单击按钮1时直接输出的是123而不是输出fd再输出123,你再看看你的代码吧。

作者: johnson.sia    时间: 2013-6-14 17:10
站长苏飞 发表于 2013-6-14 16:59
没见你在主窗体中设置virtual啊,你看我的代码
父窗体

刚才的是我改过了的:
父窗体:
          using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
namespace WinForms
{
    public partial class UpdateTruck : Form
    {
        public UpdateTruck()
        {
            InitializeComponent();
        }
        public List<TbTruck> list { get; set; }
        /// <summary>
        /// 定义属性保存选中的卡车信息
        /// </summary>
        public TbTruck tbTruck { get; set; }
        TbTruck t = new TbTruck();
        /// <summary>
        /// 更新卡车信息
        /// </summary>
        public void Update_TruckInfo()
        {
            t.Id = tbTruck.Id;
            t.Chpahaaa = this.txt_chpahaaa.Text.Trim();
            t.Chlisuyo = this.txt_chlisuyo.Text.Trim();
            t.Jifeduwe = this.txt_jifeauwe.Text.Trim();
            t.Chcuaaaa = this.txt_chcuaaaa.Text.Trim();
            t.Duweaaaa = this.txt_duweaaaa.Text.Trim();
            t.CrtUser = this.txt_crt_user.Text.Trim();
            //t.CrtDate = Convert.ToDateTime(this.txt_crt_date.Text.Trim());
            t.CrtDate = dtp_truck.Value;
            int count = TruckManage.Update(t);

            if (count > 0)
            {
                MessageBox.Show("修改成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }


        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label7_Click(object sender, EventArgs e)
        {

        }

        public virtual  void btnSubmit_Click(object sender, EventArgs e)
        {
            Update_TruckInfo();
        }

        public virtual  void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private  void StruckDetail_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                try
                {
                    TbTruck t = TruckManage.SelectOnTruckId(Convert.ToInt32(tbTruck.Id));
                    this.txt_chpahaaa.Text = t.Chpahaaa;
                    this.txt_chlisuyo.Text = t.Chlisuyo;
                    this.txt_jifeauwe.Text = t.Jifeduwe;
                    this.txt_chcuaaaa.Text = t.Chcuaaaa;
                    this.txt_duweaaaa.Text = t.Duweaaaa;
                    this.txt_crt_user.Text = t.CrtUser;
                    //this.txt_crt_date.Text = t.CrtDate.ToString();
                    dtp_truck.Value = t.CrtDate;
                    //UpdateTruck.
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
}


子窗体:
           using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BLL;
namespace WinForms
{
    public partial class AddTruck : UpdateTruck
    {
        public AddTruck()
        {
            InitializeComponent();
        }
        TbTruck t = new TbTruck();
        /// <summary>
        /// 添加卡车信息
        /// </summary>
        private void Add_TruckInfo()
        {
            t.Chpahaaa = this.txt_chpahaaa.Text.Trim();
            t.Chlisuyo = this.txt_chlisuyo.Text.Trim();
            t.Jifeduwe = this.txt_jifeauwe.Text.Trim();
            t.Chcuaaaa = this.txt_chcuaaaa.Text.Trim();
            t.Duweaaaa = this.txt_duweaaaa.Text.Trim();
            t.CrtUser = this.txt_crt_user.Text.Trim();
            //t.CrtDate = Convert.ToDateTime(this.txt_crt_date.Text.Trim());
            t.CrtDate = Convert.ToDateTime(dtp_truck.Value);
            int count = TruckManage.AddTruck(t);

            if (count > 0)
            {
                MessageBox.Show("修改成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("修改失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        public override void btnSubmit_Click(object sender, EventArgs e)
        {
            Add_TruckInfo();
        }

        public override void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void AddTruck_Load(object sender, EventArgs e)
        {

        }

    }
}






作者: 站长苏飞    时间: 2013-6-14 17:34
johnson.sia 发表于 2013-6-14 17:10
刚才的是我改过了的:
父窗体:
          using System;

你看下我的代码吧,我的测试是正常的,就没几行,你的具体是什么情况不了解,或者你再开个项目能个小例子试试我的代码,说不定不是事件本身的问题,也许是你的方法本身实现的事。
你单独写个试试,或者把你的方法修改成我的直接一个提示信息那样的。别太复杂,先看看是那里的问题
作者: johnson.sia    时间: 2013-6-17 14:16
站长苏飞 发表于 2013-6-14 17:34
你看下我的代码吧,我的测试是正常的,就没几行,你的具体是什么情况不了解,或者你再开个项目能个小例子 ...

你的确实没有问题,但我的单击新建弹出窗体有一个错误是“未将对象的引用指向对象的实例”,觉得很纳闷,调试发现子窗体会执行父窗体的 “TbTruck t = new TbTruck();” 实力化代码,子类中也有这段,怎么回事啊

作者: 站长苏飞    时间: 2013-6-17 14:20
johnson.sia 发表于 2013-6-17 14:16
你的确实没有问题,但我的单击新建弹出窗体有一个错误是“未将对象的引用指向对象的实例”,觉得很纳闷, ...

父类中所有的方法在子类中都会被继承的。
作者: johnson.sia    时间: 2013-6-17 16:48
站长苏飞 发表于 2013-6-17 14:20
父类中所有的方法在子类中都会被继承的。

使用事件委托解决了
作者: 乌托帮河畔    时间: 2013-6-25 09:09
不看不知道,看了才知道,好帖




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4