Windows.Forms, показывая отключенную форму в немодальном состоянии - PullRequest
4 голосов
/ 19 января 2010

У меня проблемы с отображением отключенной формы в немодальном состоянии.Вот пример кода:

public partial class Form1 : Form
{
    // ....
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Form2 form = new Form2();
            form.Enabled = false;
            form.Show();    // works, but form has no owner
            // form.Show(this); // gives an System.InvalidOperationException
            // ...
            // ... my program here shows a message box, ask user for something
            // ... while 'form' is shown in the background 
            form.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
}

Есть идеи, почему Show() (без параметра) работает, но Show(this) дает исключение?В моем сценарии form должен знать, что его владелец отображается правильно, поэтому я могу сделать следующее:

            form.Enabled = false;
            form.Owner=this;
            form.Show();

, но действительно ли это хорошее решение?

РЕДАКТИРОВАТЬ: Спасибо забыстрые ответы.Похоже, мы действительно нашли ошибку во фреймворке здесь.Несмотря на ваши предложения, я думаю, что буду придерживаться своего решения, поскольку отключение формы после «Показать» дает ужасно видимый эффект для пользователя.

Ответы [ 3 ]

4 голосов
/ 19 января 2010

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

3 голосов
/ 19 января 2010

Из справочного источника Microsoft:

public void Show(IWin32Window owner)
{
    if (owner == this)
    {
        throw new InvalidOperationException(SR.GetString("OwnsSelfOrOwner", new object[] { "Show" }));
    }
    if (base.Visible)
    {
        throw new InvalidOperationException(SR.GetString("ShowDialogOnVisible", new object[] { "Show" }));
    }

    // Here!!!
    if (!base.Enabled)
    {
        throw new InvalidOperationException(SR.GetString("ShowDialogOnDisabled", new object[] { "Show" }));
    }

    if (!this.TopLevel)
    {
        throw new InvalidOperationException(SR.GetString("ShowDialogOnNonTopLevel", new object[] { "Show" }));
    }
    if (!SystemInformation.UserInteractive)
    {
        throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive"));
    }
    if (((owner != null) && ((((int) UnsafeNativeMethods.GetWindowLong(new HandleRef(owner, Control.GetSafeHandle(owner)), -20)) & 8) == 0)) && (owner is Control))
    {
        owner = ((Control) owner).TopLevelControlInternal;
    }

Кстати, ошибка MS Connect объявлена.

2 голосов
/ 19 января 2010

Это или позвонить Show(this), а затем отключить его - единственные два способа, которыми я могу придумать.

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