2017-10-09 41 views
-1

我正在参考VB中的第二个项目构建的WinForms中的C#winform项目。除了按钮或标签之类的常规控件之外,我们还可以在VB项目中使用另一个项目,例如tableadapters或dataSet,它们出现在设计器表单的底部。 现在,从C#项目的问题是我怎样才能使用他们的名字得到这样的项目?从第二个项目中获取表格标记为内部的项目,使用它们的名称

我试过这个使用此代码可以访问VB项目的表单控件:

this.Controls.Find("controlName"); 

我可以做的项目类似的东西,如TableAdapter的或有使用反射任何方式来访问给定其名称?

+2

您的问题似乎我不清楚。你想从代码隐藏中访问这个控件吗? –

+0

是的。实际上我需要在另一个表单代码后面访问表格适配器 –

+1

然后在这里查看我的答案https://stackoverflow.com/a/46155570/2946329 –

回答

1

TableAdapter是一个组件,您无法通过名称找到组件。组件和控件之间有很大的区别,它们没有Name属性。

要按名称查找组件,您需要依靠反射。例如,您可以创建这样的方法:

public T GetMember<T>(string name) where T : class 
{ 
    var field = this.GetType().GetField(name, 
     System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    if (field == null) 
     return null; 
    return (T)field.GetValue(this); 
} 

然后找到任何组件,你可以写这样的代码:

var t = GetMember<System.Windows.Forms.Timer>("timer1"); 
+0

问题是关于按名称查找组件,比如'this.components [“tableAdapter1”]'这没有意义。这是问题的关键。 –

1

通过评论,它看起来像你有一个WinForms项目在VB.NET中建立一个窗体的控件设置为Friendinternal是C#的等价物)。

只需要实例化窗体并遍历其控件以获取控件。如果您想通过强类型属性访问,则必须将其访问修饰符更改为Public。但是,如果您知道控件的名称;

YourVbForm form = new YourVbForm(); 
Control c = form.Controls["yourControlName"]; 

这就是说,使用魔术字符串来标识组件并不是生产系统的方法。如果你可以控制VB项目并修改它,那么前面提到的设置修改器的方法应该足够了。但是,如果这不起作用或者您希望对应该如何访问有更多的控制权,您可以拥有一个可公开访问的属性,例如;

Public Property TableAdapter MyAdapter 
    Get 
     Return _myAdapter 
    End Get 
End Property 
+0

感谢您的回答。你的代码适用于按钮之类的控件,但即使我将修改器更改为public,它也不适用于tableAdapter –

+0

你没有错,但任何需要名称的解决方案注定要失败。名称改变,它们不可靠。评论中的相关答案是唯一的答案。 – DonBoitnott

+0

@NazaninFaghihi你如何将'TableAdapter'放到'Form'上?我已经测试了几种类型的组件,并将'Modifier'属性设置为'Public'对我来说可行 – DiskJunky

相关问题