события
От: oRover Украина  
Дата: 25.11.03 23:00
Оценка:
есть две формы: Form1 и Form2
сначала выводится Form2, в которой необходимо ввести логин и пароль. Далее пользователь нажимает на кнопку. Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.

Для этого в классе Form1 создаю делегат
public delegate void Loginning(string login, string password);

и создаю переменную этого типа
static public event Loginning loginning;


как быть далее? Я так понимаю, надо объявить ментод, который выполниться при возникновении этого события
для этого в конструкторе класса Form1:
            this.loginning +=new Loginning(Form1_loginning);

и метод:
        private void Form1_loginning(string login, string password)
        {
            //..............
        }


теперь осталось самое малое — вызвать это событие в Form1 из Form2. пробую так:
            Form1.loginning(login, password);

не хотит. Чую, я неправильно все понял
Ткните носом как надо
... << RSDN@Home 1.1.0 stable >>
Re: события
От: Sinatr Германия  
Дата: 26.11.03 12:11
Оценка:
Привет!

R>Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.


Хмм.. а зачем событие? делегат? Просто создай public static метод в form1, если нужно что-то проинициализировать (связанное с идентификацией), а после закрывай form2, создавай form1 и в конструкторе (или событии OnLoad) бери необходимые данные из статических переменных..

Если же можно создать form1 и form2 одновременно — то можно сделать не статический обмен данными (в смысле без использования static-методов и полей).
---
ПроГLамеры объединяйтесь..
Re: события
От: mihailik Украина  
Дата: 26.11.03 16:10
Оценка:
R>есть две формы: Form1 и Form2
R>сначала выводится Form2, в которой необходимо ввести логин и пароль. Далее пользователь нажимает на кнопку. Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.

Сдаётся мне, ты запутался, кто кого создаёт и кто кого вызывает.

Попробуй рассмотреть то, что ты делаешь с позиций экземпляров форм, а не просто каких-то непонятных Form1 и Form2.

Когда у тебя создаётся экземпляр формы Form1? Когда у тебя создаётся экземлпяр формы Form2?


Кроме того, есть какой-то изъян в самом подходе. Обычно событие привязано к тому объекту, с которым оно происходит.

Если пользователь кликает на кнопке, вызывается событие кнопки, а не формы там или панели. А уж форма вешается на событие Click нужной кнопки и "слушает", когда кто-то кликнет.

В таком ключе тебе было бы логично сделать событие Logining у формы-логинщицы Form2, а форма Form1 должна прицепиться на это событие. Но для такого подхода нужно, чтобы Form1 была создана до Form2 и сама форма Form2 должна создаваться из Form1.

Например, в Form1_Load можно было бы вызвать new Form2(), повеситься на событие этого экземпляра loginForm2Instance.Logining, и запустить form2Instance.ShowDialog().

public class Form1 : System.Windows.Forms.Form
{
    // InitializeComponent и т.п.

    private Form1_Load(object Sender, EventArgs e)
    {
        Form2 loginForm2Instance=new Form2();
        loginForm2Instance.Logining+=new EventHandler(loginForm2Instance_Logining);
        if( loginForm2Instance.ShowDialog()==DialogResult.Cancel )
            Application.Terminate();
    }

    private loginForm2Instance_Logining(object Sender, EventArgs e)
    {
        if( (Sender as Form2).textBox1.Text="user"
            && (Sender as Form2).textBox1.Text="password" )
        {
            (Sender as Form2).DialogResult=DialogResult.OK;
        }
    }

}
... << RSDN@Home 1.1.0 stable >>
Re[2]: события
От: oRover Украина  
Дата: 27.11.03 19:48
Оценка:
Здравствуйте, mihailik, Вы писали:

иногда бывают вещи, в которые с первого раза не могу врубиться и все. Вот на данный момент это события. В умной книжке написано — сначала нужно создать делегата события (ну в общем ясно, сродни прототипу функции).
        public delegate void Loginning(object Sender, EventArgs e);

Не пойму, в какой из этих форм мне его создавать. Создал в Form2


потом объявить событие в программе, которая возбуждает это событие (кто в моем случае возбуждает событие, Form2?). Зачем это надо — не пойму.

я взял тот код, что ты мне дал — ругается на строку
            Form2.Loginning += new EventHandler(Form2_loginning);


G:\My_VS.NET\test4\Form1.cs(64): 'test4.Form2.Loginning' denotes a 'class' which is not valid in the given context
... << RSDN@Home 1.1.0 stable >>
Re[2]: события
От: oRover Украина  
Дата: 27.11.03 19:48
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Привет!


R>>Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.


S>Хмм.. а зачем событие? делегат? Просто создай public static метод в form1, если нужно что-то проинициализировать (связанное с идентификацией), а после закрывай form2, создавай form1 и в конструкторе (или событии OnLoad) бери необходимые данные из статических переменных..


согласен, можно. Но мне кажется, что сделать через событие логичнее...


S>Если же можно создать form1 и form2 одновременно — то можно сделать не статический обмен данными (в смысле без использования static-методов и полей).
... << RSDN@Home 1.1.0 stable >>
Re[3]: события
От: Undying Россия  
Дата: 27.11.03 20:15
Оценка:
Здравствуйте, oRover, Вы писали:

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


У меня была таже проблема, тут весь прикол, что делегат вообще создавать не нужно. Да и вообще события как-то плохо воспринимаются нормальной(моей) психикой, до сих пор задумываюсь когда их нужно использовать.

Вот код, который из дочерней формы вызывают функцию главной формы.

    public class Form1 : System.Windows.Forms.Form
    {
        public static EventHandler PrintPareto;
    private void Form1_Load(object sender, System.EventArgs e)
    {
      PrintPareto += new EventHandler(menuItem2_Click);
    }

    private void menuItem2_Click(object sender, System.EventArgs e)
    {
      MessageBox.Show("Test");    
    }

    private void menuItem3_Click(object sender, System.EventArgs e)
    {
      new Form2().ShowDialog();
    }
  }
    
public class Form2 : System.Windows.Forms.Form
{
    private void menuItem1_Click(object sender, System.EventArgs e)
    {
      Form1.PrintPareto(null, null);    
    }
}
... << RSDN@Home 1.1 beta 2 >>
Re[4]: события
От: oRover Украина  
Дата: 28.11.03 18:17
Оценка:
Здравствуйте, Undying, Вы писали:

что-то оно у меня выкидывает Exception на строку
Form1.PrintPareto(null, null);

и что-то тут не так
похоже на обычный вызов метода
... << RSDN@Home 1.1.0 stable >>
Re[5]: события
От: Undying Россия  
Дата: 28.11.03 19:00
Оценка:
Здравствуйте, oRover, Вы писали:

R>что-то оно у меня выкидывает Exception на строку

R>Form1.PrintPareto(null, null);

Какой exception?
У меня работает, где-то ты химичишь. Можешь попробовать вместо null'ов передать значения, примерно так:
Form1.PrintPareto(sender, e);

R>и что-то тут не так

R>похоже на обычный вызов метода

Так у тебя цель и есть — вызов метода, только метода неизвестного экземпляра неизвестного класса. События как раз эту проблему и решают.
... << RSDN@Home 1.1 beta 2 >>
Re: события
От: rezo  
Дата: 01.12.03 15:22
Оценка:
Здравствуйте, oRover, Вы писали:

R>есть две формы: Form1 и Form2

R>сначала выводится Form2, в которой необходимо ввести логин и пароль. Далее пользователь нажимает на кнопку. Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.

R>Для этого в классе Form1 создаю делегат

R>
R>public delegate void Loginning(string login, string password);
R>

R>и создаю переменную этого типа
R>
R>static public event Loginning loginning;
R>


R>как быть далее? Я так понимаю, надо объявить ментод, который выполниться при возникновении этого события

R>для этого в конструкторе класса Form1:
R>
R>            this.loginning +=new Loginning(Form1_loginning);
R>

R>и метод:
R>
R>        private void Form1_loginning(string login, string password)
R>        {
R>            //..............
R>        }
R>


R>теперь осталось самое малое — вызвать это событие в Form1 из Form2. пробую так:

R>
R>            Form1.loginning(login, password);
R>

R>не хотит. Чую, я неправильно все понял
R>Ткните носом как надо

опиши у Form1 метод RiseLogining

    public void RiseLogining(string login, string password)
    {
        if(logining != null)
          logining(login, password)
    }


и дергай его.

            Form1.RiseLogining(login, password);
... << RSDN@Home 1.1 beta 2 >>
Re[2]: события
От: mihailik Украина  
Дата: 01.12.03 17:30
Оценка:
R>опиши у Form1 метод RiseLogining

По микрософтовской традиции такой метод принято называть OnLogining.
... << RSDN@Home 1.1.0 stable >>
Re[3]: события
От: Lloyd Россия  
Дата: 01.12.03 17:42
Оценка: +1
Здравствуйте, mihailik, Вы писали:

R>>опиши у Form1 метод RiseLogining


M>По микрософтовской традиции такой метод принято называть OnLogining.


Ага. По их традиции принято такой метод еще и протектедом делать.
А это уже не наш случай.
... << RSDN@Home 1.1.2 beta 1 >>
Re[2]: события
От: Lloyd Россия  
Дата: 06.12.03 22:41
Оценка:
Здравствуйте, rezo, Вы писали:

R>и дергай его.


R>
R>            Form1.RaiseLogining(login, password);
R>
... << RSDN@Home 1.1.2 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.