Form.Show () не показывает, что это дочерние элементы управления - PullRequest
1 голос
/ 11 марта 2010

У меня есть форма, frmPleaseWait, в которой есть MarqueeProgressBar и Label, которые я хочу использовать, когда пользовательский интерфейс загружает данные в плохо структурированное приложение, которое у нас есть.

Проблема в том, что frmPleaseWait.Show() показывает форму, но не элементы управления в ней. Это просто белый прямоугольник. Теперь frmPleaseWait.ShowDialog() показывает дочерние элементы управления, но не позволяет пользовательскому интерфейсу загружать свои данные.

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

        PleaseWait = new frmPleaseWait();
        PleaseWait.Show(this);

        // Set all available HUD values in HUD Object
        HUD.LastName = GetCurrentRowVal("LastName").Trim();
        HUD.FirstName = GetCurrentRowVal("FirstName").Trim();
        HUD.PersonId = Convert.ToInt32(GetCurrentRowVal("PersonID").Trim());
        HUD.SSn = GetCurrentRowVal("SSN").Trim();
        HUD.MiddleName = GetCurrentRowVal("MiddleName").Trim();
        HUD.MasterID = ConnectBLL.BLL.DriInterface.CheckForDriId(HUD.PersonId).ToString();

        // This loads numerous UserControls with data
        shellForm.FormPaint(HUD.PersonId);

        PleaseWait.Close();

Редактировать

Продолжайте, основываясь на ответах и ​​моих попытках.

Это то, что у меня есть, но я получаю Cross-Thread Exception на pleaseWaitInstance.Location = parent.PointToScreen(Point.Empty); Если я удалю эту строку, она будет работать, но она будет работать в верхнем левом углу экрана MY и игнорировать положение приложения.

    public partial class frmPleaseWait : XtraForm
{
    public frmPleaseWait()
    {
        InitializeComponent();
    }

    private static frmPleaseWait pleaseWaitInstance;

    public static void Create(XtraForm parent)
    {
        var t = new System.Threading.Thread(
            () =>
                {
                    pleaseWaitInstance = new frmPleaseWait();
                    pleaseWaitInstance.FormClosed += (s, e) => pleaseWaitInstance = null;
                    pleaseWaitInstance.StartPosition = FormStartPosition.Manual;
                    pleaseWaitInstance.Location = parent.PointToScreen(Point.Empty);
                    Application.Run(pleaseWaitInstance);
                });
        t.SetApartmentState(System.Threading.ApartmentState.STA);
        t.IsBackground = true;
        t.Start();
    }

    public static void Destroy()
    {
        if (pleaseWaitInstance != null) pleaseWaitInstance.Invoke(new Action(() => pleaseWaitInstance.Close()));
    }
}

Ответы [ 2 ]

4 голосов
/ 12 марта 2010

Ваша форма не работает по той же причине, что shellForm не работает. Поток пользовательского интерфейса занят загрузкой и рисованием элементов управления, он не может одновременно рисовать форму PleaseWait. Вам нужно будет создать отдельный поток, который прокачивает цикл сообщений, чтобы поддерживать форму PW. Вы можете заставить его работать так:

public partial class PleaseWait : Form {
    private static PleaseWait mInstance;
    public static void Create() {
        var t = new System.Threading.Thread(() => {
            mInstance = new PleaseWait();
            mInstance.FormClosed += (s, e) => mInstance = null;
            Application.Run(mInstance);
        });
        t.SetApartmentState(System.Threading.ApartmentState.STA);
        t.IsBackground = true;
        t.Start();
    }
    public static void Destroy() {
        if (mInstance != null) mInstance.Invoke(new Action(() => mInstance.Close()));
    }

    private PleaseWait() {
        InitializeComponent();
    }
    //etc...
}

Пример использования:

        PleaseWait.Create();
        try {
            System.Threading.Thread.Sleep(3000);
        }
        finally {
            PleaseWait.Destroy();
        }
1 голос
/ 25 октября 2011

Я столкнулся с той же проблемой, но это решение мне не помогло.

Мой путь был следующим: В program.cs я создал экземпляр формы PleaseWait и передал ее в качестве параметра основной форме:

    pleaseWaitForm pleaseWait = new pleaseWaitForm();
    Application.Run(new Form1(pleaseWait));

Конструктор Form1 запускается тогда так:

    public Form1(pleaseWaitForm pleaseWait)
    {
        InitializeComponent();
        pleaseWait.Show();
    }

Таким образом, было легко изменить, т. Е. Индикатор выполнения формы PleaseWait без проблем с потоком.

С уважением, Volker

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...