Вопрос:

обработчики событий наследования формы c # запускаются дважды

c# inheritance button

4963 просмотра

5 ответа

86 Репутация автора

Я наследую от корневой формы, в которой есть кнопка «Далее» и «Назад», затем использую эти кнопки в некоторых подчиненных формах и дважды вызываю кнопки. Я считаю, что проблема должна быть изложена в MSDN здесь: http://msdn.microsoft.com /en-us/library/e33683a5(VS.71).aspx

Как бы я применить совет, который они дают C #, а не VB?

Это вызывает много проблем, когда все мои кнопки вызываются дважды, спасибо.

Код:

Корневая форма

public partial class rootForm : Form
    {
        public rootForm()
        {
            InitializeComponent();
        }

        private void rootForm_Load(object sender, EventArgs e)
        {
            //used for all generic strings e.g. buttons
            this.Text = Resources.UIStrings.FormTitle.ToString();
            this.btnNext.Text = Resources.UIStrings.btnNext.ToString();
            this.btnBack.Text = Resources.UIStrings.btnBack.ToString();
        }

От дизайнера:

        // btnNext
        // 
        this.btnNext.DialogResult = System.Windows.Forms.DialogResult.Cancel;
        resources.ApplyResources(this.btnNext, "btnNext");
        this.btnNext.Name = "btnNext";
        this.btnNext.UseVisualStyleBackColor = true;

Установить форму

от дизайнера

        // 
        // btnNext
        // 
        this.btnNext.Location = new System.Drawing.Point(373, 360);
        this.btnNext.Size = new System.Drawing.Size(99, 23);
        this.btnNext.TabIndex = 7;
        this.btnNext.Text = "Install";
        this.btnNext.Click += new System.EventHandler(this.installButton_Click);

Из формы:

    private void installButton_Click(object sender, EventArgs e)
    {
     doSomeStuff();
    }

Вызов стека из VS для ОБА раз, когда событие вызывается

Installer.exe!Installer.InstallerForm.installButton_Click(object sender = {Text = "Siguiente"}, System.EventArgs e = {X = 21 Y = 10 Button = Left}) Line 226    C#

    [External Code] 

Installer.exe!Installer.Program.Main() Line 21 + 0x1d bytes C#

[External Code] 

Edit2 отслеживания обратного стека с точкой останова дает:

myInstaller.exe!myInstaller.InstallerForm.installButton_Click
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WmMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc
System.Windows.Forms.dll!System.Windows.Forms.ButtonBase.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Button.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.Run
myInstaller.exe!myInstaller.Program.Main
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context
mscorlib.dll!System.Threading.ExecutionContext.Run
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart
 ******************* Function: myInstaller.InstallerForm.installButton_Click(object, System.EventArgs), Thread: 0xE00 Main Thread

myInstaller.exe!myInstaller.InstallerForm.installButton_Click
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WmMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc
System.Windows.Forms.dll!System.Windows.Forms.ButtonBase.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Button.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.Run
myInstaller.exe!myInstaller.Program.Main
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context
mscorlib.dll!System.Threading.ExecutionContext.Run
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart
 ******************* Function: myInstaller.InstallerForm.installButton_Click(object, System.EventArgs), Thread: 0xE00 Main Thread

Если я присоединяюсь к разделу конструктора, где добавлен обработчик, я получаю

myInstaller.exe!myInstaller.InstallerForm.InitializeComponent
myInstaller.exe!myInstaller.InstallerForm.InstallerForm
myInstaller.exe!myInstaller.WelcomeForm.btnNext_Click
System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WmMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc
System.Windows.Forms.dll!System.Windows.Forms.ButtonBase.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Button.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.Run
myInstaller.exe!myInstaller.Program.Main
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context
mscorlib.dll!System.Threading.ExecutionContext.Run
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart
 ******************* Function: myInstaller.InstallerForm.InitializeComponent(), Thread: 0xA34 Main Thread

myInstaller.exe!myInstaller.InstallerForm.InitializeComponent
myInstaller.exe!myInstaller.InstallerForm.performChecks
myInstaller.exe!myInstaller.InstallerForm.InstallerForm
myInstaller.exe!myInstaller.WelcomeForm.btnNext_Click
System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnClick
System.Windows.Forms.dll!System.Windows.Forms.Button.OnMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WmMouseUp
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc
System.Windows.Forms.dll!System.Windows.Forms.ButtonBase.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Button.WndProc
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop
System.Windows.Forms.dll!System.Windows.Forms.Application.Run
myInstaller.exe!myInstaller.Program.Main
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context
mscorlib.dll!System.Threading.ExecutionContext.Run
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart
 ******************* Function: myInstaller.InstallerForm.InitializeComponent(), Thread: 0xA34 Main Thread

Но это не должно быть так, как будто форма создается дважды? но если я ставлю точку останова на создателя установщика, она вызывается только один раз.

Автор: Nath Источник Размещён: 21.01.2010 04:11

Ответы (5)


6 плюса

15755 Репутация автора

Решение

Не могли бы вы добавить код, как вы наследуете и используете кнопки? В C # у вас не должно быть такой проблемы, потому что нет Handlesключевого слова.

Однако вы можете добавить несколько обработчиков времени к событию click кнопки, например:

parent
    myButton.Click += myClickAction

child
    sameButton.Click += sameClickAction

При наследовании не следует нажимать на унаследованные кнопки в конструкторе (это добавит новое, может быть, то же самое действие на унаследованную кнопку)

Добавьте точку взлома в дважды выполненное действие, когда нажимаете, обратитесь к окну CallStack Visual Studio, чтобы увидеть, кто вызывает ваш метод дважды ...

РЕДАКТИРОВАТЬ

Не уверен, что происходит, но попробуйте следующее:

Заменить:

this.btnNext.Click += new System.EventHandler(this.installButton_Click);

с

this.btnNext.Click -= new System.EventHandler(this.installButton_Click);
this.btnNext.Click -= new System.EventHandler(this.installButton_Click);
this.btnNext.Click -= new System.EventHandler(this.installButton_Click);
this.btnNext.Click += new System.EventHandler(this.installButton_Click);

EDIT2

Чтобы мгновенно проанализировать вызовы вашего метода, сделайте следующее:

  1. Установите точку трассировки в методе installButton_Click: альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/S13KtR6tpYI/AAAAAAAAC9s/GpCZpXEukv4/s800/3setBreackpoint.png

  2. Отредактируйте свойства точки трассировки, чтобы отследить стек вызовов (или также использовать только $ CALLER - только предыдущую функцию): альтернативный текст http://lh6.ggpht.com/_1TPOP7DzY1E/S13KtE98okI/AAAAAAAAC9o/gW5TfXouQDM/s800/2brackpoint.png

  3. В окне «Вывод» деактивируйте (щелкните правой кнопкой мыши) все сообщения, кроме «Вывод программы»;

  4. Проанализируйте ваш вывод во время выполнения:

альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/S13Ks9YHEHI/AAAAAAAAC9k/WgnO5cBtUxI/s800/1output.png

Автор: serhio Размещён: 21.01.2010 04:16

0 плюса

1329 Репутация автора

C # добавляет обработчики событий для управления этим способом.

this.btnMyButton.Click + = new System.EventHandler (this.btnMyButton_Click);

Просто посмотрите, есть ли у вас что-то вроде вышеприведенного утверждения для вашей кнопки в производной форме, если это так, удалите / прокомментируйте ее, так как она добавляет дополнительный обработчик событий для этой кнопки.

Автор: Albert Размещён: 21.01.2010 04:27

0 плюса

1 Репутация автора

Если вы еще не решили его, попробуйте удалить создание (+ =) события в унаследованной форме и разрешить только метод события (button_click). В приведенном ниже примере я создал кнопку, которая используется в унаследованной форме, и ее поведение там отличается, но нет события пожара из базы:

FormA : Form 
{
   ...
   protected System.Windows.Forms.Button buttonBase = new System.Windows.Forms.Button();
   this.buttonBase.Click += new System.EventHandler(this.buttonBase_Click);

   protected virtual void buttonBase_Click(object sender, EventArgs e)
   {
       MessageBox.Show("Hi from base", "Hello");
   }
}

FormB : FormA
{
   ...
   // comment or remove line below, othervise you'll see "Hi from inherited form" twice
   // this.buttonBase.Click += new System.EventHandler(this.buttonBase_Click);         

   protected override void buttonBase_Click(object sender, EventArgs e)
   {
       MessageBox.Show("Hi from inherited form", "Elo");
   }
}
Автор: Marcin Szydłowski Размещён: 16.06.2012 01:23

0 плюса

41 Репутация автора

когда вы создали форму B как унаследованную от базовой формы A, все события, определенные в форме A, автоматически станут активными в вашей унаследованной форме B.

Если в вашей форме B вы добавите событие, то будет вызвано как событие базовой формы A, так и событие вашей новой формы B - сначала событие базовой формы, а затем событие вашей формы B.

если вы хотите «переопределить», то есть отключить базовое событие формы A, вы должны: 1) изменить объявление события формы с частного на защищенное (чтобы ваша форма B могла его видеть) 2) открыть конструктор формы B и вычесть это событие с помощью - знак равно

Автор: anonymous Размещён: 06.11.2013 12:13

0 плюса

301 Репутация автора

     public void addEmployee(object sender, EventArgs e)
            {

controlsAdd.addBtn.Click -= new EventHandler(controlsAdd.addEmpInfToTable);
controlsAdd.upDateBtn.Click -= new EventHandler(controlsAdd.updateEmployee); 
controlsAdd.deleteBtn.Click -= new EventHandler(controlsAdd.deleEmployee);

 splitContainer1.Panel2.Controls.Clear();
 controlsAdd.AddControls(splitContainer1);


            }

Ссылка: https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-add-to-or-remove-from-a-collection-of-controls-at-run- время

Автор: radhason power Размещён: 14.02.2019 09:58
Вопросы из категории :
32x32