Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > изменение порядка вызовов событий


Автор: vasjon 9.10.2007, 13:09
возможен ли сабж ?
для чего это мне нужно: есть нестандартный грид, у него есть 2 события: FocusedRowChanged, FocusedColumnChanged. При смене фокуса может быть 3 варианта: 
1) FocusedRowChanged, FocusedColumnChanged
2) FocusedRowChanged
3) FocusedColumnChanged
мне надо узнать на какой ячейке сейчас фокус и вызвать метод, для этого надо какое-нибудь событие после отработки этих событий... идеально подошел бы MouseDown, но он выполняется перед этими событиями :(
соотвественно вопрос: можно ли измененить порядк вызовов событий ? или может есть более простой способ ?

Автор: mr.DUDA 9.10.2007, 13:11
Обычно вместе с событием есть виртуальный метод с именем OnИмяСобытия, который можно перекрыть и добавить свои действия до (или после) вызова base.OnИмяСобытия. В base происходит генерация ИмяСобытия.

Автор: vasjon 9.10.2007, 13:47
OnFocusedRowChanged, OnFocusedColumnChanged  - нету, а OnMouseDown есть, но от него мало толку, хотя тут вопрос откуда взять параметры (System.Windows.Forms.MouseEventArgs)для этого метода ?

Автор: 1stain 9.10.2007, 15:10
Код

    public partial class Form1 : Form
    {
        private MouseEventArgs ee;
        private object mouseDownSender;
        private bool redirect = true;

        public Form1()
        {
            InitializeComponent();
            Button button1 = new Button();
            button1.Parent = this;
            button1.Size = new Size(100, 50);
            button1.MouseDown += new MouseEventHandler(button1_MouseDown);
            button1.Click += new EventHandler(button1_Click);
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            this.Text += "MouseDown occured ";
            if (redirect)
            {
                ee = e;
                mouseDownSender = sender;
            }
            else
            {
                redirect = true;
            }
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Text += "Button1_Click occured ";
            if (redirect)
            {
                redirect = false;
                button1_MouseDown(mouseDownSender, ee);
            }
        }
    }


только не лучше ли в этом случае использовать событие CellEnter ? Хотя бы потому, что фокус может менятся с клавиатуры...

Автор: vasjon 9.10.2007, 15:40
было бы событие CellEnter проблем не было бы...
моих знаний Ваш код применить не хватает.

Автор: mr.DUDA 9.10.2007, 16:31
Как костыльный вариант - создать таймер с частотой 100мс и int переменную-счётчик, и при генерации любого из событий FocusedXXXChanged сбрасывать счётчик в 0. В обработчике Timer.Elapsed увеличивать счётчик на 1 и проверять, к примеру, если он равен 5 значит прошло полсекунды с последнего события (и больше не поступало), значит можно выполнить нашу проверку выбранной ячейки и т.п. действия. События FocusedXXXChanged будут генерироваться генерироваться в любом случае быстрее, чем за полсекунды, поэтому будет некая гарантия что ячейка выбрана окончательно.

Автор: vasjon 10.10.2007, 09:59
имено этот вариант и использовал smile хотя способ читерский 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)