C# SelectedIndexChange事件在通过反射使用时不触发

C# SelectedIndexChange事件在通过反射使用时不触发,c#,.net,reflection,C#,.net,Reflection,我有一个带有listview控件的windows窗体。我有一个selectedIndex changed事件,我正在执行一些操作。通过反射,我试图设置列表视图的值。 但这一事件并没有被炒鱿鱼。任何帮助都是有益的 编辑 事件看起来像 private void LV1_SelectedIndexChanged(object sender, EventArgs e) { if (LV1.SelectedItems.Count>0) {

我有一个带有listview控件的windows窗体。我有一个selectedIndex changed事件,我正在执行一些操作。通过反射,我试图设置列表视图的值。 但这一事件并没有被炒鱿鱼。任何帮助都是有益的

编辑

事件看起来像

    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;

        }

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


也许你能告诉我们你是怎么做的?

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


也许你能告诉我们你是怎么做的?

我想你的问题就在这里:

testForm = (Form)a.CreateInstance(formType.FullName);
您正在创建表单的新实例。我假设您的主项目是一个运行显示表单的exe。然后,您的第二个项目是另一个运行并希望更改所选项目的exe。通过创建表单的新实例,您将更改新表单上的选定项,而不是旧表单上的选定项

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


我仍然不能完全确定您为什么要使用反射,您可以将第二个项目引用到第一个项目。

我认为您的问题在于:

testForm = (Form)a.CreateInstance(formType.FullName);
您正在创建表单的新实例。我假设您的主项目是一个运行显示表单的exe。然后,您的第二个项目是另一个运行并希望更改所选项目的exe。通过创建表单的新实例,您将更改新表单上的选定项,而不是旧表单上的选定项

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


我仍然不能完全确定您为什么要使用反射,您可以给第二个项目提供第一个项目的参考。

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

我建议不要尝试自动化应用程序来寻找加害点。是否有任何服务端点可以自动化并实现相同的结果?您可以使用应用程序使用的API或dll吗


如果您真的需要自动化应用程序,那么确实存在几个框架来实现这一点(通常是为了测试目的而构建的)。我现在唯一能想到的是Assima为培训目的制作的自动化应用程序。

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

我建议不要尝试自动化应用程序来寻找加害点。是否有任何服务端点可以自动化并实现相同的结果?您可以使用应用程序使用的API或dll吗


如果您真的需要自动化应用程序,那么确实存在几个框架来实现这一点(通常是为了测试目的而构建的)。我现在唯一能想到的是阿西玛出于培训目的制作的。如果您包含一些代码,这可能会有所帮助。重新编辑:我仍然没有看到任何反映…这是代码-l1.Items[0]。Selected=true;是否实际选择项目0?我只是想知道这个功能是否正常工作。是的,无论如何,我会在以后重构它。出于测试目的,我对该值进行了硬编码。如果包含一些代码,可能会有所帮助。重新编辑:我仍然没有看到任何反射…此代码为-l1.Items[0]。Selected=true;是否实际选择项目0?我只是想知道这个功能是否正常工作。是的,无论如何,我会在以后重构它。出于测试目的,我对值进行了硬编码。西蒙,关于这两个应用程序,你是对的。我们使用反射是因为我们不应该在第一个应用程序中做任何更改。我们只能在第二个应用程序中以编程方式调用表单,并自动执行原始表单操作。请建议是否有其他更好的方法在其他exe中调用表单,并自动执行这些表单上的操作。是的,请为第二个exe引用第一个exe。它不会解决您需要获取表单的现有实例的问题,也不会创建新实例,但它将节省您使用反射的时间。Simon,关于这两个应用程序,您是对的。我们使用反射是因为我们不应该在第一个应用程序中做任何更改。我们只能在第二个应用程序中以编程方式调用表单,并自动执行原始表单操作。请建议是否有其他更好的方法在其他exe中调用表单,并自动执行这些表单上的操作。是的,请为第二个exe引用第一个exe。它不会解决您需要获取表单的现有实例的问题,也不会创建新实例,但它将节省您使用反射的时间。是的,在我们寻找其他框架时,我们遇到了tho开发的“白色”UI自动化和测试框架