我有一个带有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;
}
答案 0 :(得分:2)
自动化另一个应用程序很有趣,而不是一项微不足道的任务。有几个选项,但我猜大多数选项都超出了你的范围。一种是以编程方式接管鼠标和键盘,并通过这些渠道管理程序。另一种方法是操纵内存,正如我所说的那样,如果更新应用程序并不容易实现并且很容易破坏。
我建议不要尝试自动化应用程序以查找造成的点数。是否有任何服务端点可以自动化并获得相同的结果?您可以使用的应用程序使用的任何API或dll?
如果你真的必须自动化应用程序,那么确实存在几个框架(通常用于测试目的)。我现在唯一可以想到的就是Assima为培训目的而做的。
答案 1 :(得分:1)
我认为你的问题在这里:
testForm = (Form)a.CreateInstance(formType.FullName);
您正在创建表单的新实例。我假设您的主项目是一个运行显示表单的exe。您的第二个项目是另一个运行并且想要更改所选项目的exe。通过创建表单的新实例,您将更改新表单上的选定项目,而不是旧表单。
您需要做的是以某种方式将表单对象传递给辅助项目。可能是一些获取表单单例实例的静态方法。
我仍然不完全确定你为什么使用反射,你可以给第二个项目引用第一个项目。
答案 2 :(得分:0)
我要问的第一个问题是:你为什么在这里使用反射?只需通过公共API设置值即可。如果你在公共API下面搞乱,那么是的:完全有可能某些事件不会被触发。
也许如果你能准确地向我们展示你是怎么做的?