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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение данных формы из класса, c# 
:(
    Опции темы
Pita
Дата 17.3.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста нубу(желательно примерами) как я могу из класса передать данные в форму
К примеру вот код

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


       
        private void button1_Click(object sender, EventArgs e)
        {
            cl.fun();
            
        }

    }
}

часть кода из Form1.Designer.cs


        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.Button button3;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Button button1;
        public System.Windows.Forms.RichTextBox richTextBox1;
        public System.Windows.Forms.TreeView treeView1;


сам класс


namespace WindowsFormsApplication1
{
    class cl
    {

        public static void fun()
        {

            //Вот тут надо вызвать treeView1.Nodes.Add(newNode);
        }
    }
}



PM MAIL   Вверх
source777
Дата 17.3.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Сгенерируй событие и отлови его из класса формы.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
-Mikle-
Дата 17.3.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Неправильный подход в корне, приводит к проблемам в коде...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
v00d00
Дата 17.3.2009, 21:07 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

public static class FooListClass
    {
        private static Form1 form1()
        {
            foreach (Form f in Application.OpenForms)
            {
                if (f is Form1)
                    return f as Form1;
            }
            throw new Exception("No form1");
        }

        public static void Foo()
        {
            //Работа с формой
            form1().button1.Visible = false;
        }

    }


Доступны будут соответственно только паблик свойства и методы формы. 

P.S.
По моему вы пытаетесь использовать функциональный подход в объектно ориентированном языке.

Это сообщение отредактировал(а) v00d00 - 17.3.2009, 21:18
PM MAIL   Вверх
Pita
Дата 17.3.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



-Mikle-, а можно ли узнать в чем подход неправильный??
PM MAIL   Вверх
-Mikle-
Дата 18.3.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(Pita @  18.3.2009,  01:11 Найти цитируемый пост)
-Mikle-, а можно ли узнать в чем подход неправильный??

Правил нет, но есть рекомендации.
При создании архитектуры, необходимо стремиться к уменьшению зависимостей классов друг от друга. Особенно это касается нижестоящих в структуре классов. Исключение могут составлять так называемые nested (ближние) классы (типы).
В твоем (я так понимаю тестовом) примере, класс cl находится на одном уровне с формой, а в структуре - ниже нее, так как форма создает этот класс. В таком случае, нормально то, что класс формы знает о существовании cl, но cl не должен быть привязан к форме прямой связью, иначе пропадает смысл его создания как отдельного класса. Ведь его нальзя будет использовать с другими формами. Если все же необходимо вынести код работающий с твоей конкретной формой (или неким классом) в отдельный класс, но этот код должен быть связан с кодом вышестоящего класса (такие задачи встречаются), то в таких случаях класс объявляют внутри вышестоящего класса с конструктором, принимающем ссылку на вышестоящий класс. Зачастую его использование ограничено извне и его делают private.
Код

public class SomeClass
{
    // nested type
    private class SomeClassHelper
    {
        public SomeClassHelper(SomeClass owner)
        {
            _owner = owner;
        }

        SomeClass _owner;

        public void Test()
        {
            _owner.  ....... ;
        }
    }


    public SomeClass()
    {
        myHelper = new SomeClassHelper(this);
    }

    SomeClassHelper myHelper;
}


При этом, все поля класса SomeClass (даже private) будут доступны внутри класса SomeClassHelper по ссылке _owner.

Однако, если класс будет работать с более общим базовым типом (Control, IList, .... ), то тогда есть резон сделать его самостоятельным, то есть вынести его наружу, так как его использование не зависит от конкретного его создателя. То есть он сможет работать и с формой, и с кнопкой, и с панелью.

Существует несклоько подходов по связыванию классов между собой. Конкретный подход выбирается исходя из конкретной задачи.

События хороши тогда, когда необходимо оповестить внешний класс, о тех или иных событиях smile происходящих внутри класса, не вдаваясь в подробности того, кто имеено, какой именно и как именно класс будет реагировать на них, и будет ли вобще таковой обработчик.

Интерфейсы это вообще универсальный механизм, позволяющий описать конкретные методы, события и свойства, без необходимости их конкретной реализации. Один класс, может наследовать любое кол-во интерфейсов.

Абстрактные классы тоже позволяют описать конкретный интерфейс без его реализации, но в отличие от интерфейсов, абстрактные классы могут содержать некую реализацию. Множественное наследование абстрактных классов (да и вообще классов) в .NET не допускается.

Поэтому я и сказал, что подход в корне не верный, так как это
Цитата(Pita @  17.3.2009,  22:45 Найти цитируемый пост)

        public static void fun()
        {
            //Вот тут надо вызвать treeView1.Nodes.Add(newNode);
        }

напрямую пытается использовать treeView1 конкретной твоей Form1 (ключевое слово static в объевлении метода, я списываю на опечатку). Даже если ты передашь ссылку на форму, то все равно будет неверный подход, так как Form1 будет зависеть от cl и cl будет зависеть от Form1. То есть они не смогут существовать раздельно, а значит нет необходимости разделять их код по разным классам.

Может возникнуть задача, когда некоторые ф-ии должны быть доступны везде. Тогда объявляют статический класс и статические методы. Например:
Код

public static ImageHelper
{
    public static Stream GetStream(Image image)
    {
        MemoryStream ms = new MemoryStream();
        image.Save(ms);
        ms.Seek(0, SeekOrigin.Begin);
        return ms;
    }

    public static byte[] GetArray(Image image)
    {
        return ((MemoryStream)GetStream(image)).ToArray();
    }
}



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Pita
Дата 18.3.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Благодарю за помощь, буду разбираться...
PM MAIL   Вверх
-Mikle-
Дата 19.3.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(Pita @  19.3.2009,  01:03 Найти цитируемый пост)
Благодарю за помощь, буду разбираться...

Всегда пожалуйста, для этого мы все и здесь.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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