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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как обратиться из класса к объекту на форме 
:(
    Опции темы
styu
Дата 6.11.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Возможно мой вопрос уже звучал на форуме, но я очень прошу помочь. Я только начала изучать VS и мне очень сложно и очень много я не понимаю. Написала обработчик события на нажатие клавиши delete в отдельном классе, т.е когда нажимаешь клавишу delete появляется окно messageBox с двумя кнопками Ok и Cancel, можно по ним либо согласится на удаление записи из базы, либо отменить действие. С кнопками все нормально, но я не могу из этого класса обратиться  к oleDb DataAdapter, который находится в классе Form1, чтобы обновить отображение базы в DataGrid, хотя  oleDbDataAdapter установлен в Public. Пожалуйста помогите. Может я спрашиваю элементарные вещи, но сама я никак не соображу. Заранее спасибо
PM MAIL   Вверх
Экскалупатор
Дата 6.11.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



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


 smile 
Цитата

но я не могу из этого класса обратиться  к oleDb DataAdapter, который находится в классе Form1, чтобы обновить отображение базы в DataGrid, хотя  oleDbDataAdapter установлен в Public.

если честно это у тебя какая то жесть. надо как то более гармонично разрабатывать структуру, и тогда не будут появляться такие вопросы. почему у вас oleDb DataAdapter находиться прямо в форме? и уж совсем не айс то что он public. короче просто жесть...

Это сообщение отредактировал(а) Экскалупатор - 6.11.2009, 14:26
PM MAIL ICQ   Вверх
styu
Дата 6.11.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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


Form1 fm = new Form1();
fm.OleDbDataAdapter.Fill(DataSet1.Table["База"]);
Но ничего не происходит, как я понимаю создается новая форма

Цитата

если честно это у тебя какая то жесть. надо как то более гармонично разрабатывать структуру, и тогда не будут появляться такие вопросы. почему у вас oleDb DataAdapter находиться прямо в форме? и уж совсем не айс то что он public. короче просто жесть...


Я, конечно, понимаю, что со стороны может это выглядить полной неграмотностью, но пока, к сожалению,у меня нет достаточных знаний в C#, чтобы все гармонично структурировать. На форумах писали, чтобы из класса обратиться к Control-у формы, надо установить его в public или я неправильно поняла? Заранее спасибо за ответ
PM MAIL   Вверх
KuMa1104
Дата 6.11.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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



Ои написано много всё читать лень, ивидал это
Цитата(styu @  6.11.2009,  22:16 Найти цитируемый пост)
Form1 fm = new Form1();fm.OleDbDataAdapter.Fill(DataSet1.Table["База"]);


переопредели конструктор чтоб он он у тебя как параметр принимал твою форму и использовал ссылку на неё.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Экскалупатор
Дата 6.11.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



скорее всего(я даже полностью уверен), что у тебя экземпляр fm и та форма которая у тебя показывается это две совершенно разные формы.
у тебя есть класс Program и в нем метод Main в котором есть строки
Код

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }



ты не думала что тут происходит? как раз тут и запускается твоя форма1, а то что ты объявляешь в своем классе новую форму, это уже другая форма1 и в ней нету тех данных которые тебе нужны. Сделай что бы в метод который ты выполняешь передавалась ссылка на уже запущенную форму...
покажи код своего класса в котором ты хочешь обратиться к форме.
PM MAIL ICQ   Вверх
KuMa1104
Дата 6.11.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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





MyClass
{
Form1 fm = null;
MyClass(Form1 f)
{
fm = f;
}

// теперь можне делать любые чёрные дела)))

void func()
{
fm.OleDbDataAdapter.Fill(DataSet1.Table["База"])
}
}


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



KuMa1104, теперь ты меня опередил...))))
PM MAIL ICQ   Вверх
KuMa1104
Дата 6.11.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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



Аха ха!!!!

Экскалупатор привет!
Оперативно работаемс))

Я только хотел это написать))

У тебя как 6 чуство, наверно!!!!



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Экскалупатор
Дата 6.11.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



KuMa1104, тип того...


styu, относительно архитектуры. нельзя делать public поля(точнее, физически конечно можно, но это неправильно), тебе надо сделать метод который бы управлял этим полем и через него работать. это будет уже что то, а еще лучше убрать это поле совсем, сделать отдельный класс для базы и сделать класс который будет соединять базу с формой. как то так. а иначе каша жесть какая получается. сам года два назад так делал, теперь как взгляну так аж плакать хочется...
PM MAIL ICQ   Вверх
KuMa1104
Дата 6.11.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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



Тогда уж может быть лучше определить интерфеисы, посредством реализации которых в классе будет осушествляться управление?

Покраине мере это будет гарантировать что класс содержит минимальный набор функций и методов необходимых для работы.

Добавлено через 4 минуты и 58 секунд
Я имею в виду что форме в принципе всё равно что за класс, главное чтоб он реализовал интерфейс.

Код

MyClass : IViev
{
void IViev.Init()
{
// ...............
}




А форма работает с классом
Код

MyClass GG;
//......
IViev Iva = GG as IViev;
if(Iva != null)
{
Iva.Init();
// и тодгдалее
}




--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
styu
Дата 8.11.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо огромное за ответы, я Вам все очень благодарна. Почитав Ваши сообщения поняла, что я очень многого не знаю. Поделитесь, пожалуйста, с чего Вы начинали изучать С#. Заранее спасибо
PM MAIL   Вверх
KuMa1104
Дата 9.11.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

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



С любой книжки которая тебе понравиться))

Я читал Троелсен Эндрю С# и платформа нет.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
styu
Дата 10.11.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня к сожалению ничего не получилось. Выкладываю код класса, может это поможет
Код


class MyMessageFilter: IMessageFilter
       {
    const int WM_KEYDOWN = 0x0100;
    EventArgs e;

    public class WinManager
        {
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string className,string windowName);
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd,uint msg, IntPtr wParam, IntPtr lParam); 
         }

             public class WindowKiller
         {
        private const uint WM_CLOSE = 0x0010;
        public static void CloseWindow(string className,string windowName)
              {
             IntPtr hWnd = WinManager.FindWindow(className,windowName);
             WinManager.SendMessage(hWnd,WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
               }
          }

      private void CloseMessageBox()
          {
        WindowKiller.CloseWindow("#32770",null);
          }
                
       public bool PreFilterMessage(ref Message m)
          {    
        if(m.Msg == WM_KEYDOWN)
             {
            Keys key = (Keys)(int)m.WParam;
            switch(key)
            {
                  case Keys.Delete:
                  {
                string message = "Эта запись будет удалена. Вы хотите удалить запись?";
                string caption = "Question";
                MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                DialogResult result;
                result = MessageBox.Show(message, caption, buttons,   Messeigneurs.Question,  MessageBoxDefaultButton.Button1, 
                MessageBoxOptions.DefaultDesktopOnly);
                            
                if(result == DialogResult.No)
                    {
                    CloseMessageBox();
                    MessageBox.Show("Try to close me!");

                                                           // Вот тут хотелось бы обратиться к форме
                                                           // точнее к OleDbDataAdapter  
                    }
                break;
                  }
            }
        }


 Заранее спасибо
PM MAIL   Вверх
Экскалупатор
Дата 10.11.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



как я и говорил твой класс ничего не знает о существовании формы.
я так понял у тебя есть класс 
class MyMessageFilter
в котором есть еще другие классы(зачем кстати, для меня осталось загадкой, разбираться не стал)
так вот, передай в этот класс ссылку на свою форму, это можно сделать в конструкторе, или в методе который будет ее использовать.
например
public MyMessageFilter(Form1 form)
{
}
или тут
public bool PreFilterMessage(ref Message m, Form1 form)

а потом в методе своем пиши
form.OleDbDataAdapter и че там тебе надо, если конечно поле OleDbDataAdapter объявлено как public.

если ты этот класс используешь в своей форме то вызывай его так
MyMessageFilter myMessageFilter = new MyMessageFilter(this);//это если в конструктор ссылку передавать

а если в метод то соответственно myMessageFilter.PreFilterMessage("тут какой то message", this)
и все должно работать.

Это сообщение отредактировал(а) Экскалупатор - 11.11.2009, 00:13
PM MAIL ICQ   Вверх
styu
Дата 12.11.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

public MyMessageFilter(Form1 form)
{
}



Так записать не могу, выдает синтаксическую ошибку

Цитата

или тут
public bool PreFilterMessage(ref Message m, Form1 form)


в методе я тоже не могу записать, синтаксическая ошибка, так как bool PreFilterMessage(ref Message m);

Записала 

Код

class MyMessageFilter:IMessageFilter
       {    
           Form1 form;
           // Далее в методе пишу
           public bool PreFilterMessage(ref Message m)
           { 
                        form.oleDbDataAdapter1.Fill(form.dataSet1.Tables["База"]);
                     }
         }


Это все компилируется, но при вызове метода PreFilterMessage выдает ошибку: 

An unhandled exception of type 'System.NullReferenceException' occurred in Project.exe

Additional information: Object reference not set to an instance of an object.

И что с этим делать дальше не знаю  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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