วิธีใส่การควบคุมผู้ใช้ WinForms หนึ่งรายการในสามแบบฟอร์มและอัปเดตทั้งสามพร้อมกันได้อย่างไร

วิธีสร้าง UserControl ซึ่ง

เช่น 3 winforms และ 1 UserControl

การเพิ่ม UserControl ให้กับทุกแบบฟอร์ม แต่หากผู้ใช้โดยการคลิกในแบบฟอร์มใดรูปแบบหนึ่งเปลี่ยนเนื้อหา UserControl แบบฟอร์มทั้งหมดจะแสดงการเปลี่ยนแปลงเดียวกัน

แก้ไขแล้ว

ฉันคิดว่ามันใช้งานได้แล้ว พื้นที่มืดคือการควบคุมผู้ใช้ที่มีเนื้อหาบางส่วน http://img28.imageshack.us/img28/6169/naamloostl.png

ข้อความแสดงแทน http://img36.imageshack.us/img36/7362/naamloos1bt.png< /ก>


person User6996    schedule 20.02.2010    source แหล่งที่มา
comment
ขอแสดงความยินดีที่ได้ทำงาน! คุณใช้ Public static class เพื่อรวมศูนย์การอัปเดตหรือไม่ การซิงโครไนซ์ WinForms TextBoxes แบบเลื่อนออกไปนั้นเป็นเรื่องที่ยุ่งยากหากคุณไม่ได้สังเกต ขอให้โชคดี,   -  person BillW    schedule 20.02.2010
comment
ใช่ ฉันใช้ชั้นเรียนสาธารณะ ขอบคุณสำหรับข้อมูล   -  person User6996    schedule 20.02.2010
comment
คำถามของคุณเป็นหนึ่งในแหล่งที่มาของแรงบันดาลใจในการพัฒนาเทคนิคสำหรับการอัปเดตหลายรายการที่แสดงไว้ที่นี่ในคำถาม SO นี้: stackoverflow.com/questions/2391828/ ขอบคุณ !   -  person BillW    schedule 06.03.2010


คำตอบ (4)


... ยาวเกินไปสำหรับความคิดเห็น ... อาจเพิ่มตัวอย่างโค้ดนี้หาก OP ร้องขอ ...

หากเป็น 'WinForms โปรดเพิ่มแท็ก "WinForms" ให้กับแท็กของคุณ

คุณอาจต้องการชี้แจง: คุณกำลังมองหาวิธีแก้ปัญหาที่นี่ที่จะ "ขยายขนาด" เพื่อครอบคลุมกรณีที่คุณอาจมีการควบคุมมากมายบน UserControl (นับสิบ? ร้อย?) ที่คุณใช้ซ้ำในหลาย ๆ แบบฟอร์ม ซึ่งทั้งหมดนี้ จำเป็นต้องซิงโครไนซ์:

หากคุณกำลังมองหาการปรับขนาด) ฉันคิดว่าคุณจะต้องสำรวจ 'DataSource ตามที่ Asad แนะนำ (โปรดทราบว่าเฉพาะตัวควบคุม WinForms บางตัวเท่านั้น [เช่น ComboBox เป็นต้น] เท่านั้นที่มี 'คุณสมบัติ DataSource) และ 'DataBinding เป็น Jake แนะนำ; คำตอบทั้งสองนั้นชี้ให้คุณเห็นถึงความจำเป็นในการใช้แนวทาง "ระดับสูงกว่า" ในการซิงโครไนซ์สถานะ

สำหรับโซลูชัน "ขนาดเล็กกว่า" คุณอาจพิจารณาเพิ่มไฟล์ "การตั้งค่า" และใช้เป็นที่เก็บสำหรับค่าปัจจุบัน

ไม่ว่าในกรณีใด คุณยังคงต้องยกเหตุการณ์ ... ด้วยการเปลี่ยนแปลงทุกครั้งใน UserControl ปัจจุบันที่มีโฟกัส ... เพื่อทริกเกอร์การอัปเดตการควบคุมในอินสแตนซ์ UserControl อื่น ๆ

หรือขึ้นอยู่กับการออกแบบและข้อกำหนดของคุณ หากคุณสามารถยอมรับว่า UserControl แต่ละรายการไม่ได้อัปเดตทันที : คุณสามารถเลื่อนการทริกเกอร์การอัปเดตได้จนกว่าผู้ใช้จะเปลี่ยนไปใช้แบบฟอร์มอื่น : จากนั้นแบบฟอร์มที่ใช้งานก่อนหน้านี้จะทริกเกอร์ 'ปิดใช้งานเหตุการณ์: ในเหตุการณ์นั้นคุณ สามารถตรวจจับได้ว่าการตั้งค่ามีการเปลี่ยนแปลงหรือไม่ (โดยใช้ "บิตสกปรก" บางชนิดใน UserControl ?) จากนั้นอัปเดต UserControls อื่น ๆ ตามต้องการ: ฉันเดาว่าคุณต้องการการอัปเดตทันที

ข้อดีอีกประการหนึ่งที่จะชี้แจงเพื่อให้ได้คำตอบที่ดีที่สุดที่นี่อาจเป็น: แบบฟอร์มหลายรูปแบบเหล่านี้เป็นอย่างไร โดยแต่ละแบบฟอร์มมีอินสแตนซ์ของ UserControl เดียวกันถูกสร้างขึ้น : มี "แบบฟอร์มหลัก" หนึ่งรายการที่สร้างแบบฟอร์มอื่นทั้งหมดหรือไม่ อินสแตนซ์ของแบบฟอร์ม : หรือนี่คือโมเดล "SDI" ที่สร้างแต่ละฟอร์มโดยแยกจากกัน แบบฟอร์มใดมีคุณสมบัติ Parent ที่กำหนดเป็นค่าที่ไม่ใช่ค่าว่าง (เช่น แบบฟอร์มใดมีแบบฟอร์มอื่นเป็น Parent) หรือไม่

หากคุณต้องการตัวอย่างโค้ดที่ใช้งานได้ของการใช้คลาสคงที่สาธารณะสำหรับโซลูชัน "ขนาดเล็ก" สำหรับคำถามของคุณ "ตามที่ถาม" : เพียงแค่ถามที่นี่แล้วฉันจะโพสต์หนึ่งรายการ: มันจะไม่ "หรูหรา" แต่มัน จะทำงาน :)

person BillW    schedule 20.02.2010
comment
ฉันไม่แน่ใจอีกต่อไปว่าฉันต้องการอะไร บางทีฉันควรยกตัวอย่างสถานการณ์อีกสักหน่อย ฉันมีแบบฟอร์มหลัก (+ UserControls) ซึ่งถูกซ่อนไว้เป็นส่วนใหญ่ ผู้ใช้สามารถเข้าถึงเนื้อหาได้เฉพาะเพื่อแจ้งเตือนเท่านั้น ดังนั้นฉันจึงต้องการแบบฟอร์มที่สองซึ่งจะแสดงสิ่งที่เกิดขึ้นภายในแบบฟอร์มหลัก และหากจำเป็น ให้ยกเลิก/รีสตาร์ทความคืบหน้า สิ่งเล็กๆ ฟังดูเหมือนเป็นวิธีแก้ปัญหาสำหรับฉัน มันคงจะดีไม่น้อยหากคุณโพสต์ตัวอย่างของคุณ - person User6996; 20.02.2010
comment
@ Power-Mosfet มันจะช่วยฉัน (และคนอื่น ๆ ที่อ่านข้อความนี้ ฉันคิดว่า) ถ้าคุณอธิบายสิ่งที่คุณต้องการเห็นอย่างชัดเจน ผู้ใช้สามารถมองเห็น UserControls ได้จำนวนเท่าใดในแต่ละครั้ง? นอกจากนี้ยังจะช่วยให้ทราบว่าการควบคุมประเภทใดอยู่ใน UserControl : หากเป็นการควบคุมที่มีคุณสมบัติ 'แหล่งข้อมูล ดังนั้นตามที่ Asad แนะนำข้างต้น คุณจะมีฟังก์ชันการเชื่อมโยงข้อมูลในตัว หากส่วนควบคุมไม่มี 'แหล่งข้อมูล เช่น กล่องข้อความ หรือกล่องกาเครื่องหมาย แสดงว่าคุณอยู่ในจุดที่แตกต่างจริงๆ กับการพยายาม databind และนั่นคือจุดที่โค้ดอย่างสิ่งที่ฉันจะโพสต์จะมีประโยชน์ - person BillW; 20.02.2010

ให้พวกเขาชี้ไปที่เดียวกัน DataSource

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
ขออภัย แต่ฉันยังไม่เข้าใจ เก็บสิ่งที่ชี้ไปยังแหล่งเดียวกัน ตัวอย่างเดียวกันที่ใช้งานได้ดีจะดีมาก ขอบคุณ - person User6996; 20.02.2010

ทางออกที่ดีกว่าคือการมีคลาสแบบคงที่พร้อมตัวจัดการเหตุการณ์และวิธีการสาธารณะ

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

ใน winform ของคุณ:

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

แต่ละแบบฟอร์มจะโฮสต์อินสแตนซ์เฉพาะของ UserControl คุณจะต้องใช้เหตุการณ์ / การเชื่อมโยงข้อมูลเพื่อให้มีการเปลี่ยนแปลงในรูปแบบหนึ่งทำให้เกิดการอัปเดตในรูปแบบอื่น ๆ

person Jake    schedule 20.02.2010