Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > MFC - SetItemData(int,DWORD ) C# - ?


Автор: xTr1m 21.9.2008, 19:33
Добрый день. собственно сильно не бейте плз =))  при переходе на C# с C++  понял, что не знаю как это реализовано. В частности, если есть список чего-либо (или грид) , то каждая строчка содержит информацию о чем то конкретном ( о сотруднике, предприятии, машине и т.п.). Премного благодарен.

P.S. Может этот механизм вообче как то по-другому реализован? =))

Автор: xTr1m 22.9.2008, 15:18
Наверно криво объяснил ситуацию. У меня есть таблица, допустим, каждая строка описывает модель компьютера. В MFC я мог записать
Код

m_list.SetItemData(0, (DWORD)prtComputer);


где prtComputer - указатель на объект, описывающий компьютер. Таким образом, потом при, скажем, двойном щелчке мыши на строке такой таблицы, я мог показать свойства
этого компьютера примерно так
Код

CCompProp dlg( m_list.GetItemData(0) );
dlg.DoModal();


А как реализовать подобное на С# это?

Автор: Partizan 22.9.2008, 15:32
xTr1m, кидается DataGridView или ListView

DataGridView более сложный контрол, и наверное не нужен в этом случае...


вот пример из MSDN для ListView:

Код

private void InitializeListView()
    {
        this.ListView1 = new System.Windows.Forms.ListView();
        this.ListView1.BackColor = System.Drawing.SystemColors.Control;
        this.ListView1.Dock = System.Windows.Forms.DockStyle.Top;
        this.ListView1.Location = new System.Drawing.Point(0, 0);
        this.ListView1.Name = "ListView1";
        this.ListView1.Size = new System.Drawing.Size(292, 130);
        this.ListView1.TabIndex = 0;
        this.ListView1.View = System.Windows.Forms.View.Details;
        this.ListView1.MultiSelect = true;
        this.ListView1.HideSelection = false;
        this.ListView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;
        
        ColumnHeader columnHeader1 = new ColumnHeader();
        columnHeader1.Text = "Breakfast Item";
        columnHeader1.TextAlign = HorizontalAlignment.Left;
        columnHeader1.Width = 146;

        ColumnHeader columnHeader2 = new ColumnHeader();
        columnHeader2.Text = "Price Each";
        columnHeader2.TextAlign = HorizontalAlignment.Center;
        columnHeader2.Width = 142;

        this.ListView1.Columns.Add(columnHeader1);
        this.ListView1.Columns.Add(columnHeader2);

        string[] foodList = new string[]{"Juice", "Coffee", 
            "Cereal & Milk", "Fruit Plate", "Toast & Jelly", 
            "Bagel & Cream Cheese"};
        string[] foodPrice = new string[]{"1.09", "1.09", "2.19", 
            "2.49", "1.49", "1.49"};
        
        for(int count=0; count < foodList.Length; count++)
        {
            ListViewItem listItem = new ListViewItem(foodList[count]);
            listItem.SubItems.Add(foodPrice[count]);
            ListView1.Items.Add(listItem);
        }
        this.Controls.Add(ListView1);
    }



Автор: xTr1m 22.9.2008, 16:41
Спасибо, но вопрос был все-таки немного о другом. Нельзя ли с каждой строкой с ассоциировать некий объект. Причем это может быть объект любого типа: int , string, свой класс?
Наверно, что то типа переменной variant в Basic 

Автор: Partizan 22.9.2008, 19:44
xTr1m, у каждого ListvViewItem есть свойство Tag

Автор: xTr1m 23.9.2008, 09:26
Мммм, спасибо еще раз =)). То есть Tag принимает любой объект, унаследованный от Object. А в C# любой созданный класс автоматом наследуется от Object?
То есть, если я напишу свой класс (условный код)
Код

class SomeObject
{
}


То я потом и его смогу "засунуть" в Tag. Извиняюсь,  что спрашиваю, просто до Студии не могу добраться ))

Автор: Freak_FB 23.9.2008, 11:05
Все объекты являются потомками класса Object. Поэтому любой объект иможно положить в Tag.
Если используешь ListBox - можно через метод Add() добавлять непосредственно объект, а не строку. В таком случае для отображения объекта нужно переопределить метод ToString().
За другими компонентами такой функциональности, вроде бы, не замечено.

Автор: Partizan 23.9.2008, 11:45
почитайте про boxing/unboxing в .NET

Автор: QryStaL 23.9.2008, 12:46
boxing/unboxing - это немного другое. Здесь просто полиморфизм.

Автор: Partizan 23.9.2008, 14:43
Никакого полиморфизма тут и в помине нет...возможно вы имели ввиду наследование...да..за счёт наследования наследник System.Object легко приводится к базовому типу

тем более когда мы суём value type в ListViewItem.Tag происходит как раз таки boxing/unboxing...

Автор: QryStaL 23.9.2008, 15:54
Нет, я имел в виду как раз полиморфизм.
Цитата(Freak_FB @  23.9.2008,  11:05 Найти цитируемый пост)
Все объекты являются потомками класса Object. Поэтому любой объект иможно положить в Tag.


А boxing/unboxing будет только для value типов, то есть не всегда.

Автор: xTr1m 23.9.2008, 21:47
всем спасибо, разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)