2010-12-14 8 views
1

У меня есть форма1, есть кнопка «загрузить» и «следующая» кнопка. По умолчанию «следующая» кнопка отключена. Когда я нажимаю кнопку «загрузить», я вызову метод из download.cs, отличный от form1.cs. После загрузки я хочу, чтобы кнопка «next» была включена, поэтому в файле download.cs после получения всех файлов я помещаюC# как включить кнопку из другого класса

form1.btnNext.Enabled = true;

Но это не сработает. Я также поставить это в Form1.cs

общественного недействительными enableButton (BOOL включен)

{ btnNext.Enabled = включен; }

и download.cs я поставил:

частный form1 Form1; ...

form1.enableButton (true);

но это также не работает. Может ли кто-нибудь показать мне, где я ошибаюсь? заранее спасибо.

+2

Что вы имеете в виду под «его не работает "? Вы получаете сообщение об ошибке или ничего не происходит? вы установили точку останова, чтобы увидеть, действительно ли код вызван? – Botz3000

+0

Можете ли вы добавить код, который создает переменную "form1"? –

+1

Выполняется ли загрузка с другой темой? –

ответ

0

Если вы замерзли ваш пользовательский интерфейс во время загрузки, чем

1- Определить событие в вашем классе Downloader

public delegate void EnableUI(bool shdEnable); 

    public event EnableUI MakeUIEnabled; 

2- Hook это событие в вашей form1 классе, я предполагаю, что вы создаете объект загрузки класса в кнопку загрузки или она создается на уровне класса, позволяет сказать, что этот объект, как customDownloader

customDownloader.MakeUIEnabled+=new EnableUI(EnableUIControls); 

3- Определить правша событие в form1 класса, как Sho wn ниже.

public void EnableUIControls(bool shdEnable) 
    { 
     btnNext.Enabled = shdEnable; 

    } 

4- Давайте сйа, что существует метод DownloadFile() в download.cs файл поэтому, когда загрузка будет завершена, чем поднять это событие.

 public void DownLoadFile() 
     { 
      if(MakeUIEnabled!=null) 
      MakeUIEnabled(true); 

     } 

тха-х он

+0

да, все. Он отлично работает для меня. Но теперь я снова думаю, что лучше иметь небольшую форму или всплывающее диалоговое окно, указывающее, что файлы загружаются ... Но я предполагаю, что это будет позже, теперь я должен попытаться завершить свое приложение, а затем улучшить позже. Еще раз спасибо, ур код помог мне кучу, также прояснил некоторые облака в моей голове о threading и делегирование/событие дескриптор. – PeteMerry

2

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

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

0

Я помню, как сталкивался с чем-то подобным, и вы можете попытаться сделать свою (следующую) buttonpublic вместо частной, но это не очень восхитительный подход, но я думаю, если вы сделаете шляпу, то ваше первое предложение будет работать.

и если это не вы можете попробовать сделать это:

Form1 Myform = новый Form1; myform.nxtButton.enabled = true;

это, безусловно, работать

+0

Прошу прощения, я забыл добавить, что я уже изменил свойство кнопки на public в form1.designer.cs, и это не сработало. – PeteMerry

0

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

0

Вы можете сделать это с помощью обратного вызова. Так что в вашем Download.cs, у вас есть что-то вроде этого:

public delegate void EnableNextCallback (bool enable); 

public static void Download(EnableNextCallback n) { 
    // stuff 
    // when you're done 
    n(true); 
} 

Таким образом, вы можете передать свой метод EnableButton в ваш метод загрузки.

+0

спасибо, этот ответ такой же, как у Saurabh's, и я изменил какое-то место в коде, и теперь он отлично работает. – PeteMerry

0

Вы должны иметь ссылку на Form1 в Form2. Является ли Form2 диалоговым окном, дочерним окном MDI и т. Д.? Установлено ли в качестве родительского окна Form1? Form1 открыть Form2?

Если Form1 действительно открыт Form2, вы можете установить у владельца свойство ссылку на Form1 с кодом Form2. Также убедитесь, что для button10 в Form1 установлено значение PUBLIC (оно по умолчанию закрыто).

В Form1, вы будете иметь такой код:

Form2 MyForm2 = new MyForm2(); 

MyForm2.Owner = this; // "this" being Form1 

MyForm2.Show(); 

Form2 В всякий раз, когда вы хотите получить доступ к button10 на Form1, сделайте следующее:

(this.Owner as Form1).button10.Enabled = false; 
Смежные вопросы