Могу ли я установить ShowDialog (), чтобы не быть верхним?

StackOverflow https://stackoverflow.com/questions/816981

Вопрос

Есть ли способ установить ShowDialog (), чтобы он не был верхним? Я рассмотрел все связанные с этим вопросы, и ни один не вполне соответствовал моей ситуации.

Что я делаю, так это открываю новую WinForm из столбца кнопки просмотра данных. Эта новая форма извлекает информацию из нескольких таблиц SQLite и позволяет пользователю добавлять информацию в строку, по которой была нажата кнопка.

Я открываю WinForm, используя код ниже. Я использую метод ShowDialog (), чтобы определить, сохраняет ли пользователь информацию в форме или отменяет ее.

Pay_Bill_Window paywindow = new Pay_Bill_Window(getClickedRowID);
if (paywindow.ShowDialog() == DialogResult.OK)
{
    FillPendingPaymentDataGrid(dbAccess.GetPendingBills());
}

Я делаю это, чтобы определить, нужно ли перезагрузить информацию в представлении данных.

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

Есть ли способ, которым я могу помешать окну показываться поверх всех приложений (самый верхний в моей серии окон - это нормально), или есть способ определить, какую кнопку пользователь нажимает в другой форме (в основном, используя paywindow.Show () и отслеживая другой тип возврата)?

Спасибо за любую помощь!

Это было полезно?

Решение

используйте что-то вроде этого: форма1:

  private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
            frm.FormIsClosing += frm_FormIsClosing;

        }

        void frm_FormIsClosing(object sender, DialogResult rsl)
        {
            if (rsl == System.Windows.Forms.DialogResult.Yes)
                MessageBox.Show("We got it");
        }

form2:

   public delegate void IsClosing(object sender, DialogResult rsl);

        public event IsClosing FormIsClosing;


        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            FormIsClosing(this, System.Windows.Forms.DialogResult.Yes);
        }

затем вы закрываете формы Form2, FormIsClosing запускает и можете поймать его из from1;)

Другие советы

По умолчанию форма не должна быть TopMost в смысле "для всех приложений". Если вы видите такое поведение, скорее всего, это свойство было установлено в конструкторе. Либо удалите свойство в конструкторе, либо попробуйте следующее.

using ( Form form = CreateMyForm() ) {
  form.TopMost = false;
  form.ShowDialog(parent);
  ...
}

Я не нашел способа предотвратить верхний край формы при показе с помощью ShowDialog () (это показывает форму как модальную, и я не знаю, как переопределить она).

Однако я нашел способ отслеживать вторую форму, когда она отображается с помощью Show () , наблюдая за событием form.Disposed в этот вопрос StackOverflow .

От Яна :

Form2 form2 = null;

void button_click(object sender, EventArgs e) 
{     
    if(form2 == null)   
    {
        form2 = new Form2();
        form2.Disposed += new EventHandler(f_Disposed);
        form2.Show();
    }
}

void f_Disposed(object sender, EventArgs e) 
{
    form2 = null; 
}

Насколько я могу судить, это не позволяет мне понять, почему форма была закрыта (например, с помощью DialogResult ), поэтому событие вызывается каждый раз, когда форма закрывается, что нормально для моей ситуации.

paywindow.ShowDialog(this)

должно работать. дополнительный параметр сообщает, каков родитель и сделает его слоем поверх родительского, но не верхним. Самый верхний означает, что окно будет висеть на вашем рабочем столе, даже когда вы активируете другое окно. Это не поведение по умолчанию для ShowDialog. Как упоминал JaredPar, установите для вашей формы / окна значение TopMost = false, чтобы оно было истинным.

paywindow.ShowDialog(this)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top