есть две формы: Form1 и Form2
сначала выводится Form2, в которой необходимо ввести логин и пароль. Далее пользователь нажимает на кнопку. Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.
Для этого в классе Form1 создаю делегат
public delegate void Loginning(string login, string password);
и создаю переменную этого типа
static public event Loginning loginning;
как быть далее? Я так понимаю, надо объявить ментод, который выполниться при возникновении этого события
для этого в конструкторе класса Form1:
Привет!
R>Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.
Хмм.. а зачем событие? делегат? Просто создай public static метод в form1, если нужно что-то проинициализировать (связанное с идентификацией), а после закрывай form2, создавай form1 и в конструкторе (или событии OnLoad) бери необходимые данные из статических переменных..
Если же можно создать form1 и form2 одновременно — то можно сделать не статический обмен данными (в смысле без использования static-методов и полей).
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;
}
}
}
иногда бывают вещи, в которые с первого раза не могу врубиться и все. Вот на данный момент это события. В умной книжке написано — сначала нужно создать делегата события (ну в общем ясно, сродни прототипу функции).
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
Здравствуйте, Sinatr, Вы писали:
S>Привет!
R>>Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.
S>Хмм.. а зачем событие? делегат? Просто создай public static метод в form1, если нужно что-то проинициализировать (связанное с идентификацией), а после закрывай form2, создавай form1 и в конструкторе (или событии OnLoad) бери необходимые данные из статических переменных..
согласен, можно. Но мне кажется, что сделать через событие логичнее...
S>Если же можно создать form1 и form2 одновременно — то можно сделать не статический обмен данными (в смысле без использования static-методов и полей).
Здравствуйте, 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);
}
}
Здравствуйте, oRover, Вы писали:
R>что-то оно у меня выкидывает Exception на строку R>Form1.PrintPareto(null, null);
Какой exception?
У меня работает, где-то ты химичишь. Можешь попробовать вместо null'ов передать значения, примерно так:
Form1.PrintPareto(sender, e);
R>и что-то тут не так R>похоже на обычный вызов метода
Так у тебя цель и есть — вызов метода, только метода неизвестного экземпляра неизвестного класса. События как раз эту проблему и решают.
Здравствуйте, oRover, Вы писали:
R>есть две формы: Form1 и Form2 R>сначала выводится Form2, в которой необходимо ввести логин и пароль. Далее пользователь нажимает на кнопку. Хочу, чтобы после нажатия на кнопку в Form2 возникло мной созданное событие loginning в Form1 и началась вся канитель с аутентификацией и т.д.
R>Для этого в классе Form1 создаю делегат R>