Mohammed Sarhan Ответов: 3

Почему появляются две формы?


после запуска
при нажатии на любой элемент из
accordionControl

он открывает одну и ту же форму дважды, хотя я сделал только один экземпляр в коде
??

Что я уже пробовал:

using DevExpress.XtraBars;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SalesPro1._1.Forms; 
using System.Reflection;  


namespace SalesPro1._1.Forms
{
    public partial class frm_Main : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
    {
        public frm_Main()
        {
            InitializeComponent();
            accordionControl1.ElementClick+= accordionControl1_ElementClick;
        }

        private void accordionControl1_ElementClick(object sender, 
 DevExpress.XtraBars.Navigation.ElementClickEventArgs e)
        {
            // Error: this code make 2 instances of form

            var tag = e.Element.Tag as string;
            if (tag != string.Empty)
            {
                OpenFormByName(tag);
            }
        }

        public static void OpenFormByName(string name)
        {
            var ins = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == name);
            if (ins != null)
            {
                var frm = Activator.CreateInstance(ins) as Form;
                frm.Show();
            }
        }

    }
}

3 Ответов

Рейтинг:
4

Mohammed Sarhan

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

private void ace_CompanyInfo_Click(object sender, EventArgs e)
{
    OpenFormByName("frm_CompanyInfo");
}

private void ace_Drawers_Click(object sender, EventArgs e)
{
    OpenFormByName("frm_Drawers");
}

private void ace_Stores_Click(object sender, EventArgs e)
{
    OpenFormByName("frm_Stores");
}

private void ace_StoresList_Click(object sender, EventArgs e)
{
    OpenFormByName("frm_StoresList");
}


-------------
кто-то мне помог, просто поменял код внутри
OpenFormByName
с этим кодом:
public static void OpenFormByName(string name)
        {
            var ins = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == name);
            if (ins != null)
            {
                var frm = Activator.CreateInstance(ins) as Form;
                if (Application.OpenForms[frm.Name] != null)
                {
                    frm = Application.OpenForms[frm.Name];
                    frm.BringToFront();
                }
                else
                {
                    frm.Show();
                }
            }
        }


Richard Deeming

Если вы хотите обновить свой вопрос, чтобы добавить дополнительную информацию, Нажмите зеленую ссылку "улучшить вопрос" и отредактируйте свой вопрос.

Не опубликуйте это обновление как "решение" вашего вопроса.

Рейтинг:
2

BillWoodruff

Отказ от ответственности: я не знаком с формой разнообразия DevExpress, используемой здесь.

1.ваше приложение, вероятно, создает первый экземпляр вашей основной формы при запуске ... и показ его: это стандартное поведение приложения WinForm, а затем вы создаете его снова.

2 ошибочно создавать формы и добавлять их в элемент управления контейнера: используйте UserControls или другой элемент управления.

3 в OpenFormByName вы создаете форму причудливым образом, используя отражение, а не сохраняя ссылку на нее вне метода.

Вам необходимо изучить основы программирования на C# с помощью форм и элементов управления. Воспользуйтесь технической поддержкой DevXpress, если вы купили их дорогое программное обеспечение.


0x01AA

Неопределенный ответ. Так стоит ли мне голосовать за № 1? - Нет, не знаю.

Рейтинг:
1

OriginalGriff

На первый взгляд, вы добавляете accordionControl1.ElementClick обработчик дважды, один раз в этом коде и один раз в конструкторе.

Поскольку события "прикованы", если вы добавите один и тот же метод обработчика к одному и тому же событию дважды, то он будет вызван дважды, когда произойдет событие.

Чтобы доказать это, нужен доступ ко всему вашему проекту, которого у нас нет.
Начните с того, что щелкните правой кнопкой мыши имя метода в VS и выберите "Найти все ссылки" из выпадающего списка - это будет список всех мест, где он используется, включая файлы конструктора.
Кроме того, используйте отладчик, чтобы поместить точку останова в первую строку метода и посмотреть, сколько раз он выполняется.

Извините, но мы ничего не можем сделать для вас!