C# - 从另一个类访问树视图控件

时间:2012-03-16 08:07:38

标签: c# class treeview

我正在使用Visual Studio 2010在C#中使用Windows窗体应用程序。

  • 表单mainForm
  • mainForm包含树视图控件xmlTreeView
  • 有一个自编的课程myClass.cs

现在,myClass需要访问xmlTreeView。但是我不知道a)如何访问表单和b)哪种方式最好这样做。

我尝试在oleksii's answer之后实现一个接口,但我没有得到它。应用程序的主要形式定义如下:

public interface IMainForm {
  TreeView treeView { get; }
} 

public partial class mainForm : Form, IMainForm {

  public TreeView treeViewControl {
    get { return myTreeViewControl; }
  }

  // Some code here
  [...]

  RuleTree rt = new RuleTree(); //How do I call this with the IMainForm interface???
}

另一个类RuleTree的定义如下:

class RuleTree {
  private readonly IMainForm mainForm;
  public RuleTree(IMainForm mainForm) {
    this.mainForm = mainForm;
  }

}

如何使用IMainForm接口调用RuleTree的构造函数???

4 个答案:

答案 0 :(得分:2)

我会做以下事情。不要将其视为代码,只是为了让您理解,您可以相应地修改它。

public class MyClass
{
     public void MyMethod(YourTreeViewControl treeview)
     {
          // Do what you need to do here
     }
}

然后在你的表单代码后面实例化MyClass并将你的treeview实例传递给它,如下所示:

MyClass myClass = new MyClass();
myClass.MyMethod(tvYourTreeViewControl);

希望这是有道理的:)

答案 1 :(得分:1)

其中一种可能的方法是在这里使用依赖注入。 MyClass将有一个带Form参数的构造函数。因此,当您创建MyClass时,它将具有注入形式。例如:

Foo
{
    Foo(){}
}

Bar
{
    private Foo currentFoo;

    Bar(Foo foo) //dependency injection
    {
        currentFoo = foo;
    }

    public void OtherMethod()
    {
        //do something with currentFoo
    }
}

最好使用接口(或抽象类),因此可以注入Foo代替IFoo,这很大程度上解耦了你的类,这是一个很好的设计决策。

答案 2 :(得分:0)

我评论了我的代码,请阅读评论,我也可以提供解决方案。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
        static class Program
        {


   /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 

        //Declare a static form that will accesible trhought the appication
        //create form called frmMain form or any other name
        //
        public static frmMain MainForm { get; private set; }
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //comment out default application run
            //Application.Run(new MainForm());

            //create a new instance of your frmMain form
            //inside your main form add a tree view
            //Loacte this file "frmMain.Designer.cs"
            //Change treeView1 from private to public
            //  public System.Windows.Forms.TreeView treeView1;
            MainForm = new frmMain();

            //before I show my form I'll change docking of my tree  view from myClass
            MyClass mine = new MyClass();  //done

            MainForm.ShowDialog();

        }


    }

    public class MyClass
    {        
        public MyClass()
        {
            Program.MainForm.treeView1.Dock = DockStyle.Fill;
        }

    }
}

答案 3 :(得分:-2)

这不可能将asp.net服务器端控件访问到除cs类以外的其他类中 test.aspx是一个页面 您只能在test.aspx.cs中访问测试页控件 除此之外,这是不可能的。