Событие SelectedIndexChange не срабатывает при использовании сквозного отражения - PullRequest
0 голосов
/ 10 июня 2009

У меня есть форма окна с контролем списка. У меня выбрано событие selectedIndex, в котором я выполняю какое-то действие. Через размышления я пытаюсь установить значение представления списка. Но событие не начинается. Любая помощь будет полезна.

Редактировать

Событие выглядит как

    private void LV1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (LV1.SelectedItems.Count>0)
        {
            if (LV1.SelectedItems[0].Text.ToString() == "testing")
            {
               // Do some work.
            }
        }

    }

Я использую переизбрание в другом проекте и изменяю выбранный элемент следующим образом

Assembly a = Assembly.LoadFrom(exePath);
Type formType = a.GetType(formName);
testForm = (Form)a.CreateInstance(formType.FullName);
if (testForm != null)
        {
            Type t1 = testForm.GetType();
            FieldInfo fi = t1.GetField(controlName, flags);
            object ctrl = fi.GetValue(testForm);
            ListView l1 = (ListView)ctrl;    
            l1.Items[0].Selected = true;

        }

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

Автоматизация другого приложения - это весело, но не тривиальная задача. Есть несколько вариантов, но я думаю, что большинство из них выходит за рамки ваших возможностей. Можно было бы программно взять на себя мышь и клавиатуру и через эти каналы управлять программой. Другим способом было бы манипулировать памятью. Как я уже сказал, ни один из них не тривиален в реализации и очень легко ломается, если приложение обновлено.

Я бы предложил вместо того, чтобы пытаться автоматизировать приложение, чтобы найти точки нанесения. Есть ли какие-либо конечные точки обслуживания, которые вы могли бы автоматизировать и достичь того же результата? какой API или dll используется приложением, которое вы могли бы использовать вместо этого?

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

1 голос
/ 10 июня 2009

Я думаю, что ваша проблема здесь:

testForm = (Form)a.CreateInstance(formType.FullName);

Вы создаете новый экземпляр формы. Я предполагаю, что ваш основной проект - exe, который запускает показывает форму. Ваш второй проект - другой исполняемый файл, который хочет изменить выбранный элемент. Создав новый экземпляр формы, вы будете изменять выбранный элемент в новой форме, а не в старой.

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

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

0 голосов
/ 10 июня 2009

Первый вопрос, который я хотел бы задать: почему вы используете отражение здесь? Просто установите значение через публичный API. Если вы работаете с открытым API, тогда да: вполне возможно, что некоторые события не будут запущены.

Возможно, если бы вы могли показать нам точно как вы делаете это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...