C # - доступ к древовидному элементу управления из другого класса - PullRequest
1 голос
/ 16 марта 2012

Я работаю над приложением Windows Forms в C # с Visual Studio 2010.

  • Есть форма mainForm.
  • mainForm содержит элемент управления в виде дерева xmlTreeView.
  • Существует самописный класс myClass.cs.

Теперь myClass должен получить доступ к xmlTreeView. Однако я не знаю а) как получить доступ к форме и б) какой способ лучше всего для этого сделать.

Я пытался реализовать интерфейс, следуя ответу Алексея , но я не получил его. Основная форма заявки определяется следующим образом:

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;
  }

}

Как мне вызвать конструктор RuleTree с интерфейсом IMainForm ???

Ответы [ 4 ]

2 голосов
/ 16 марта 2012

Я бы сделал следующее. Не воспринимайте это как код, это просто, чтобы вы могли понять, вы можете изменить его соответствующим образом.

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

Затем в вашем коде форм просто создайте экземпляр MyClass и передайте ему экземпляр вашего дерева, что-то вроде этого:

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

Надеюсь, это имеет смысл:)

1 голос
/ 16 марта 2012

Один из возможных подходов заключается в использовании здесь внедрения зависимости.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, это в значительной степени разъединит ваши классы, что является хорошим решением для проектирования.

0 голосов
/ 16 марта 2012

Я прокомментировал мой код, пожалуйста, прочитайте комментарии, я также могу сделать решение доступным.

    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;
        }

    }
}
0 голосов
/ 16 марта 2012

Невозможно получить доступ к элементам управления на стороне сервера asp.net в другом классе, кроме их класса cs, например. test.aspx это страница Вы можете получить доступ к элементам управления тестовой страницы только в test.aspx.cs Кроме этого класса это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...