Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DevExpress TreeList, Как получить вставленный объект 
V
    Опции темы
gol2
Дата 9.3.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



[c#]

Есть два класса:
Код

public class MYMenu
{
        private string title;
      private int idx;
      public string Title { get { return title; } set { title = value; } }
      public int Idx get { return idx; } set { idx = value; } }
}
public class MYForm
{
        private string title;
      private string notice;
      public string Title { get { return title; } set { title = value; } }
      public int Notice { get { return notice; } set { notice = value; } }
}

Есть объект на форме:
treeList1 объект класса DevExpress.XtraTreeList.TreeList;

Запустить для treeList1 “Run Designer” и 
добавить одну колонку colName:
                               FieldName: “Name”

Колонка нужна для отображения смысловой информации: поле Title (каждый класс имеет это поле).

Добавляем на форму кнопку: “Two” (Клик на кнопке добавляет в TreeList два объекта - отсюда и название)
Код

private void Two_Click(object sender, EventArgs e)
{
  MYMenu m1 = new MYMenu(“File”, 1);
  MYForm f1 = new MYForm(“FormForFile”, “Test Form”);

  TreeListNode tln1 = treeList1.AppendNode(m1, null);
  tln1.SetValue("Name", m1.Title);
  TreeListNode tln2 = treeList1.AppendNode(f1, null);
  tln2.SetValue("Name", f1.Title);
}    
    

После клика на кнопке “Two” на экране в объекте treeList1 появятся два узла:
  - “File”;
  - “FormForFile”.

Вопрос как с помощью обработчика 
Код

        private void treeList1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
        }


получить любой из вставленных объектов? Т.е. как получить объект m1 или f1?

PM MAIL   Вверх
CYBERDREAM
Дата 9.3.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 4
Всего: 28



Код

var info = treeList1.CalcHitInfo(e.Location);
//->info.Node


Кстати, если ты дважды кликнешь по узлу в колонке, у которой AllowEdit = true, то ты не прийдешь в treeList1_MouseDoubleClick а тебе откроется редактор узла.

Добавлено @ 15:15
Кстати, 
Код

public class MYMenu
{
        private string title;
      private int idx;
      public string Title { get { return title; } set { title = value; } }
      public int Idx get { return idx; } set { idx = value; } }
}

не лучше ли заменить на 
Код

public class MYMenu
{
      public string Title { get; set ;}
      public int Idx { get;set;}
}


Компилятор все равно ведь сгенерит эти поля


Это сообщение отредактировал(а) CYBERDREAM - 10.3.2010, 07:02


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
gol2
Дата 10.3.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Цитата(CYBERDREAM @ 9.3.2010,  15:14)
Код

var info = treeList1.CalcHitInfo(e.Location);
//->info.Node


Язык программирования c#.
labelControl1: DevExpress.XtraEditors.LabelControl; (элемент отображающий реакцию на двойной клик).

Уважаемый CYBERDREAM, не могу воспользоваться вашей подсказкой.

Вот фрагмент кода который я вставил в обработчик:
Код

            TreeListHitInfo hi = treeList1.CalcHitInfo(e.Location);
            TreeListNode ln = hi.Node;
            object o = ln.GetValue("Name"); 
            labelControl1.Text = o.ToString();


т.к. в первый узел с помощью поля Name отображает строку "File" то после двойного клика не нём получим 
labelControl1.Text = "File";
Если сделать двойной клик по второму узлу, получим:
labelControl1.Text = "FromForFile";
Это не то, что мне нужно


Я, наверно, неясно сформулировал задачу.

Задача - с помощью обработчика события treeList1_MouseDoubleClick получить объект который был вставлен в treeList методом:  ( TreeListNode tln = treeList1.AppendNode(obj, null); )

где obj - объект класса MYMenu или MYForm (или другого класса). т.е. в данном случае мне надо получить объект конкретного класса MYMenu или MYForm.

Я, так, понимаю, что необходимо получить сначала адрес объекта хранящегося в treeList1, а затем по этому адресу получить сам объект.

Задача вроде и не сложная, но я просто не знаю синтаксиса.
Уже неделю или больше смотрю документацию, но пока результат не достигнут. 
Если Вы поможете, буду рад.

Это сообщение отредактировал(а) gol2 - 10.3.2010, 13:38
PM MAIL   Вверх
CYBERDREAM
Дата 10.3.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 4
Всего: 28



Добрый день gol2 Странно почему нулл, должно работать
А по поводу твоих нодов, Думаю в классах тогда стоит переопределить ToString

Код

public class MYMenu
{
     //бла бла бла

    public override string ToString()
        {
            return Title;
        }
}

А то в трилисте по идее не особо "полезная" информация будет отображена)

Вот пример
Код

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using DevExpress.Utils;
using DevExpress.XtraTreeList;

namespace win
{
    public partial class Form1 : Form
    {
     
        Dictionary<Keys,Boolean> _keys=new Dictionary<Keys, bool>();

        public Form1()
        {
            InitializeComponent();

            treeList1.Nodes.Clear();
            treeList1.AppendNode(new object[]{new my("Верхний узел", this)},null);
            treeList1.AppendNode(new object[] { new my("Нижний", this) }, null);
      }
      private void treeList1_MouseDoubleClick(object sender, MouseEventArgs e)
      {
            var info = treeList1.CalcHitInfo(e.Location);
            if (info.Node != null && info.Node[0] is my)
                MessageBox.Show(((my) info.Node[0]).Title);
       }
   }

    public class my
    {
        public String Title { get; set; }

        public Object Tag { get; set; }

        public my(String title, Object tag)
        {
            Title = title;
            Tag = tag;
        }

        public override string ToString()
        {
            return Title;
        }
    }
}


Это сообщение отредактировал(а) CYBERDREAM - 10.3.2010, 13:39


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
gol2
Дата 10.3.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Добрый день, CYBERDREAM.

Я действительно ошибся с null.

Далее, я полностью создал новую форму.
В объекте TreeList была добавлена колонка: treeList.Nodes: treeListColumn1 - для отображения информации.

Чуть-чуть усложнил объект класса my - добавил одно поле: int Idx и переопределил метод ToString().
Это сделано для того, чтобы не было никакх сомнений с чем работаем.

Вот код:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes;
using DevExpress.XtraTreeList.Columns;

namespace OLClient
{
    public partial class FormForTreeList : DevExpress.XtraEditors.XtraForm
    {
        public FormForTreeList()
        {
            InitializeComponent();

            treeList1.Nodes.Clear();

            my m1 = new my("Верхний узел", 1, this);
            my m2 = new my("Нижний узел", 2, this);

            TreeListNode tln1 = treeList1.AppendNode(m1, null);
            tln1.SetValue("treeListColumn1", m1.Title);
            TreeListNode tln2 = treeList1.AppendNode(m2, null);
            tln2.SetValue("treeListColumn1", m2.Title);

            MessageBox.Show("m2: " + m2.GetType()); // строка показывает тип объекта
        }

        public class my
        {
            public String Title { get; set; }
            public int Idx { get; set; }
            public Object Tag { get; set; }
            public my(){Title = ""; Idx = 0; Tag = null;}
            public my(String title, int idx, Object tag) {Title = title; Idx = idx; Tag = tag; }

            public override string ToString()
            {
                return "Title: " + Title + ", Idx: " + Idx.ToString();
            }
        }

        private void treeList1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            var info = treeList1.CalcHitInfo(e.Location);
            if (info.Node != null)
            {
                if (info.Node[0] is my)
                {
                    MessageBox.Show("Type object my: "+((my)info.Node[0]).Title);
                }
                else
                {
                     MessageBox.Show("Type object not my: "+info.Node[0].ToString()+"\n"+
                    "info.Node[0].GetType: "+info.Node[0].GetType());
                }
            }
        }

    }
}


После запуска программы получаем сообщение: m2: OLClient.FormTreeList+my (это объект класса my !! пока всё отлично!)

После двойного клика на первом элементе (my m1 = new my("Верхний узел", 1, this);) 
На экране появляется сообщение : "Type object not my: Верхний узел"
                                                           "info.Node[0].GetTyp: System.String"

Мы не получаем объект типа my.
Мы получаем колонку: treeList.Nodes: treeListColumn1.

Ужас!!


PM MAIL   Вверх
CYBERDREAM
Дата 10.3.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 4
Всего: 28



Брым брым  smile ) ты же перетираешь значение в узле. Сделай как я написал
Код

//            TreeListNode tln1 = treeList1.AppendNode(m1, null);
//            tln1.SetValue("treeListColumn1", m1.Title);
//            TreeListNode tln2 = treeList1.AppendNode(m2, null);
//            tln2.SetValue("treeListColumn1", m2.Title);

// заменить на 
treeList1.AppendNode(new object[]{m1}, null);
treeList1.AppendNode(new object[]{m2}, null);
            




--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
gol2
Дата 11.3.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Привет, CYBERDREAM.
Похоже, что ты полностью прав.
Когда сделаю, всё для чего это дело затеивалось - сообщу.

СПАСИБО!!
PM MAIL   Вверх
gol2
Дата 18.3.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Привет, CYBERDREAM.

Ещё один вопрос.

В treeList1 были добавлены узлы:

Код

treeList1.AppendNode(new object[]{m1}, null);
treeList1.AppendNode(new object[]{m2}, null);



С помощью обработчика treeList1_MouseDoubleClick объект находящийся в узле извлечь получилось.
А как извлечь объект с помощью обыкновенного цикла?
Например:

Код

            object obj;

            for (int i = 0; treeList1.Nodes.Count - 1; i++)
            {
                obj = ...;
                if (obj is my)
                {
                    ...
                }
            }




PM MAIL   Вверх
CYBERDREAM
Дата 19.3.2010, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 4
Всего: 28



Немного теории так сказать. 
Код

treeList1.AppendNode(new object[]{m1,m2,m3,...}, null); 

Количество объектов соответствует количеству колонок в трилисте. Т.е. в узле в колонке1 - будет m1, в колонке2 - будет m2....

И так, когда пройдешь по узлам дерева, обратись к объекту, в той или иной колонке узла
Код

            for (int i = 0; treeList1.Nodes.Count - 1; i++)
            {
                if (treeList1.Nodes[i][0] is my)// Проверяем в первой колонке
                {
                    my myObject=(my)treeList1.Nodes[i][0];
                }
            }



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
gol2
Дата 19.3.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.9.2007

Репутация: нет
Всего: нет



Спасибо, дорогой товарищ CYBERDREAM.
Очень помог!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.