Bagaimana Cara Menempatkan Satu Kontrol Pengguna WinForms pada Tiga Formulir dan Memperbarui Ketiganya Secara Bersamaan?

Cara Membuat UserControl yang mana

misalnya 3 winform dan 1 UserControl,

menambahkan UserControl ke semua formulir tetapi jika pengguna dengan mengklik salah satu formulir mengubah konten UserControl, semua formulir menampilkan perubahan yang sama.

Diedit

Saya pikir itu berhasil sekarang. area gelap adalah kontrol pengguna dengan beberapa konten http://img28.imageshack.us/img28/6169/naamloostl.png

http://img36.imageshack.us/img36/7362/naamloos1bt.png


person User6996    schedule 20.02.2010    source sumber
comment
Selamat karena telah berhasil! Apakah Anda akhirnya menggunakan kelas statis Publik untuk memusatkan pembaruan? Omong-omong, sinkronisasi WinForms TextBoxes yang tertunda sangat merepotkan, jika Anda belum menyadarinya. Semoga beruntung,   -  person BillW    schedule 20.02.2010
comment
ya saya menggunakan kelas publik. terima kasih atas masukannya   -  person User6996    schedule 20.02.2010
comment
Pertanyaan Anda adalah salah satu sumber inspirasi untuk mengembangkan teknik pembaruan ganda yang ditunjukkan di sini dalam pertanyaan SO ini: stackoverflow.com/questions/2391828/ Terima kasih!   -  person BillW    schedule 06.03.2010


Jawaban (4)


...terlalu panjang untuk dikomentari...bisa menambahkan contoh kode ini jika OP meminta...

Jika 'WinForms, harap tambahkan tag "WinForms" ke tag Anda.

Anda mungkin ingin menjelaskan: apakah Anda mencari solusi di sini yang akan "meningkatkan" untuk mencakup kasus di mana Anda mungkin memiliki banyak kontrol pada UserControl (puluhan? Ratusan?) yang Anda gunakan kembali pada banyak Formulir, yang semuanya perlu disinkronkan:

Jika Anda (mencari peningkatan), maka saya pikir Anda perlu menjelajahi 'DataSource seperti yang disarankan Asad (perhatikan bahwa hanya kontrol WinForms tertentu [seperti ComboBox, misalnya] yang memiliki 'properti DataSource), dan 'DataBinding sebagai Jake menyarankan; kedua jawaban tersebut mengarahkan Anda pada perlunya pendekatan "tingkat yang lebih tinggi" untuk menyinkronkan keadaan.

Untuk solusi "skala lebih kecil", Anda mungkin mempertimbangkan untuk menambahkan file "Pengaturan", dan menggunakannya sebagai tempat penyimpanan untuk nilai saat ini.

Bagaimanapun, Anda masih perlu memunculkan acara ... dengan setiap perubahan di UserControl saat ini yang memiliki fokus ... untuk memicu pembaruan kontrol di instance UserControl lainnya.

Atau, tergantung pada desain dan kebutuhan Anda, jika Anda dapat menerima bahwa setiap UserControl tidak segera diperbarui: Anda dapat menunda pemicuan pembaruan hingga pengguna beralih ke Formulir lain: maka Formulir yang sebelumnya aktif akan memicu 'Nonaktifkan Acara: jika Acara tersebut Anda dapat mendeteksi apakah pengaturan telah berubah (menggunakan semacam "bit kotor" di UserControl?), dan kemudian memperbarui UserControls lainnya sesuai kebutuhan: namun menurut saya Anda ingin segera memperbaruinya.

Hal baik lainnya, imho, yang perlu diklarifikasi untuk mendapatkan respons terbaik di sini mungkin adalah: bagaimana tepatnya beberapa Formulir ini, masing-masing berisi turunan dari UserControl yang sama, dibuat: apakah ada satu "Formulir Utama" yang membuat semua Formulir lainnya Contoh formulir : atau apakah ini model "SDI" di mana setiap Formulir dibuat secara independen. Apakah salah satu Formulir memiliki properti Induk yang disetel ke nilai bukan nol (yaitu, apakah ada Formulir yang memiliki Formulir lain sebagai Induk)?

Jika Anda ingin contoh kode kerja menggunakan kelas statis publik untuk solusi "skala kecil" untuk pertanyaan Anda "seperti yang diminta": tanyakan saja di sini, dan saya akan mempostingnya: itu tidak akan "elegan", tetapi itu akan bekerja :)

person BillW    schedule 20.02.2010
comment
Saya tidak lagi yakin mana yang saya inginkan. mungkin saya harus memberi contoh situasi yang lebih banyak. Saya memiliki formulir utama(+ Kontrol Pengguna) yang sebagian besar tersembunyi, pengguna dapat mengakses kontennya hanya untuk tempat pemberitahuan. jadi untuk itu saya memerlukan formulir kedua yang menampilkan apa yang terjadi di dalam formulir utama dan jika perlu batalkan/mulai ulang progresnya. skala kecil sepertinya solusi bagi saya. akan lebih baik jika Anda memposting sampel Anda. - person User6996; 20.02.2010
comment
@ Power-Mosfet Akan membantu saya (dan orang lain yang membaca ini, menurut saya) jika Anda menjelaskan dengan tepat apa yang ingin Anda lihat. Berapa banyak Kontrol Pengguna yang terlihat oleh pengguna pada satu waktu? Ini juga akan membantu untuk mengetahui jenis Kontrol apa yang ada di UserControl : jika Kontrol tersebut memiliki 'properti Sumber Data, maka, seperti yang disarankan Asad di atas, Anda memiliki fungsi pengikatan data bawaan. Jika Kontrol tidak memiliki 'Sumber Data, seperti Kotak Teks, atau Kotak Centang, misalnya, maka Anda berada di tempat yang sangat berbeda dengan mencoba menyatukan data, dan di situlah kode seperti yang akan saya posting dapat berguna. - person BillW; 20.02.2010

biarkan mereka menunjuk ke DataSource yang sama

public void UpdateControls()
  {
    List<string> filesDataSource = GetFiles(); // replace with your Datasource

    Control1.DataSource = filesDataSource ;
    Control2.DataSource = filesDataSource ;
    Control3.DataSource = filesDataSource ;

    Control1.DataBind();
    Control2.DataBind();
    Control3.DataBind();
  }

  Control1_SelectedIndexChanged(.............) // Replace with your evnents
  {
   // 
   //
   UpdateControls();
  }
person Asad    schedule 20.02.2010
comment
Maaf tapi saya belum mengerti. pertahankan apa yang menunjuk ke sumber yang sama. sampel apa pun yang berfungsi sama akan bagus. Terima kasih - person User6996; 20.02.2010

Solusi yang lebih baik adalah dengan memiliki kelas statis dengan event handler dan metode publik.

public static class Signal
{
    public static EventHandler OnSignal {get;set}
    public static void SendSignal()
    {
        if (OnSignal !=null) OnSignal(this,new EventArgs());
    }
}

Dalam formulir win Anda:

protected void Form1_load(object sender, EventArgs e)
{
    Signal.OnSignal += new EventHandler(IGotSignal)
}

protected void IGotSignal(object sender, EventArgs e)
{
    MessageBox.Show("i got a signal")
}

protected void button1_Click(object sender,EventArgs e)
{
    Signal.SendSignal();
}
person stephan wegener    schedule 12.12.2010

Setiap formulir akan menampung instance unik dari UserControl. Anda harus menggunakan peristiwa/pengikatan data agar perubahan dalam satu bentuk menyebabkan pembaruan pada bentuk lainnya.

person Jake    schedule 20.02.2010