Visual Studio 2013, Visual C#, Aplikasi Formulir Windows.

Saya tertarik dengan dua kelas Formulir. AfterTheGameForm.cs dan TheGameForm.cs.

Yang pertama muncul hanya jika pengguna mengklik tombol di yang kedua.

AfterTheGameForm afterTheGameForm = new AfterTheGameForm();
afterTheGameForm.Show(this);

Jadi jelas bahwa TheGameForm adalah Pemilik AfterTheGameForm. Dan di sinilah letak masalah saya... Di kelas AfterTheGameForm Saya ingin merujuk ke kelas Pemilik untuk menggunakan metode spesifiknya. Saya tahu pasti bahwa Pemiliknya adalah tipe TheGameForm dan saya mencoba untuk melemparkan:

TheGameForm gForm = (TheGameForm)this.Owner;
        if(gForm!=null){               
            MessageBox.Show(theGameForm.CheckedRadioButton);
        }
        else
        {
            MessageBox.Show("theGameForm==null");
        }

Saya juga mencoba pemeran ini:

TheGameForm gForm = this.Owner as TheGameForm;

Objek gForm adalah null! Bagaimana mungkin?

1
Mr T 20 Juli 2016, 00:53
Tanpa contoh minimal yang dapat direproduksi tidak mungkin mendiagnosis masalah dalam kode Anda. Yang mengatakan, dari sedikit kode yang Anda posting, terlihat bahwa AfterTheGameForm Anda sangat erat digabungkan ke TheGameForm, yaitu mengetahui jenis dan mengakses anggota tertentu dari kelas secara langsung. Desain yang lebih baik akan menggunakan peristiwa atau abstraksi lain untuk memungkinkan bentuk berinteraksi tanpa benar-benar terikat satu sama lain dengan cara itu. Dengan kata lain, AfterTheGameForm seharusnya tidak perlu properti Owner disetel agar hal yang benar terjadi di sini.
 – 
Peter Duniho
20 Juli 2016, 01:01
Ya, Anda benar. Saya tidak tahu bagaimana merancang kode yang baik, itu masalah saya! :) Saya menemukan solusi itu dengan pemiliknya dan mencoba menggunakannya.
 – 
Mr T
20 Juli 2016, 01:06
Cara lain untuk menemukannya adalah TheGameForm gForm = Application.OpenForms.OfType<TheGameForm>().FirstOrDefault();
 – 
Slai
20 Juli 2016, 01:26

1 menjawab

Jawaban Terbaik

Itu mungkin karena Anda mengaksesnya di konstruktor. Owner disetel setelah konstruktor. Coba acara Load.

7
Jeroen van Langen 20 Juli 2016, 02:27
Mengapa kode asli mencoba menggunakan Owner di konstruktor? Agaknya OP setidaknya memahami bahwa karena konstruktor harus kembali bahkan sebelum dia dapat memanggil metode Show(), properti Owner tidak mungkin disetel di sana.
 – 
Peter Duniho
20 Juli 2016, 01:07
Sebenarnya fakta bahwa Pemilik disetel SETELAH konstruktor mungkin membantu!
 – 
Mr T
20 Juli 2016, 01:07
Van Langen Itu berhasil juga dengan acara Load!
 – 
Mr T
20 Juli 2016, 01:15