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

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

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

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

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 03 мая 2009

используйте что-то вроде этого: форма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");
        }

форма2:

   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);
        }

затем вы закрываете форму2, FormIs закрывает пожары и можете поймать ее из1;)

1 голос
/ 03 мая 2009

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

using ( Form form = CreateMyForm() ) {
  form.TopMost = false;
  form.ShowDialog(parent);
  ...
}
0 голосов
/ 08 мая 2010
paywindow.ShowDialog(this)

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

0 голосов
/ 03 мая 2009

Я не нашел способа предотвратить верхний край формы при отображении с 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), поэтому событие запускается каждый раз, когда форма закрывается, что нормально для моей ситуации.

0 голосов
/ 03 мая 2009
paywindow.ShowDialog(this)
...