通过反射使用时,SelectedIndexChanged事件未触发

时间:2009-06-10 08:35:35

标签: c# .net reflection

我有一个带有listview控件的窗体。我有一个selectedIndex更改事件,我正在执行一些操作。通过反射,我试图设置列表视图的值。 但事件并没有被解雇。任何帮助都会有所帮助。

修改

事件看起来像是

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

    }

我在另一个项目中使用relection并按如下所示更改所选项目

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 个答案:

答案 0 :(得分:2)

自动化另一个应用程序很有趣,而不是一项微不足道的任务。有几个选项,但我猜大多数选项都超出了你的范围。一种是以编程方式接管鼠标和键盘,并通过这些渠道管理程序。另一种方法是操纵内存,正如我所说的那样,如果更新应用程序并不容易实现并且很容易破坏。

我建议不要尝试自动化应用程序以查找造成的点数。是否有任何服务端点可以自动化并获得相同的结果?您可以使用的应用程序使用的任何API或dll?

如果你真的必须自动化应用程序,那么确实存在几个框架(通常用于测试目的)。我现在唯一可以想到的就是Assima为培训目的而做的。

答案 1 :(得分:1)

我认为你的问题在这里:

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

您正在创建表单的新实例。我假设您的主项目是一个运行显示表单的exe。您的第二个项目是另一个运行并且想要更改所选项目的exe。通过创建表单的新实例,您将更改新表单上的选定项目,而不是旧表单。

您需要做的是以某种方式将表单对象传递给辅助项目。可能是一些获取表单单例实例的静态方法。

我仍然不完全确定你为什么使用反射,你可以给第二个项目引用第一个项目。

答案 2 :(得分:0)

我要问的第一个问题是:你为什么在这里使用反射?只需通过公共API设置值即可。如果你在公共API下面搞乱,那么是的:完全有可能某些事件不会被触发。

也许如果你能准确地向我们展示你是怎么做的?