WCF RIA DataForm ComboBox


 

การจัดการข้อมูลที่มีความสัมพันธ์แบบ Master Detail คือมีตารางแม่(Master) และตารางลูก(Detail) ถ้าเรามองถึงความสัมพันธ์ในความเป็นจริง แม่หนึ่งคนสามารถมีลูกได้หลายคน และในทางกลับกันลูกหนึ่งคนสามารถมีแม่ได้เพียงคนเดียว กล่าวคือความสัมพันธ์แม่กับลูกเป็นความสัมพันธ์แบบ 1:M ในโลกของการออแบบ relational database ตัวอย่างแสดงดังรูป 

1

จากรูป: เราสามารถกล่าวถึงความสัมพันธ์ ได้ดังนี้

Category หนึ่ง Category สามารถมี Product ได้หลาย Product และในทางกลับกัน หนึ่ง Product สามารถมี Category ได้เพียงหนึ่ง Category เช่น

ประเภทสินค้าเครื่องเขียน (หนึ่ง Category) สามารถมีสินค้า ได้หลายสินค้า เช่น ปากกา,ดินสอ, สมุดเขียน, สมุดระบายสี, เป็นต้น

Supplier หนุึ่ง Supplier สามารถมี สามารถมี Product ได้หลาย Product และในทางกลับกัน หนึ่ง Product สามารถมี Supplier ได้เพียงหนึ่ง Supplier เช่น

สินค้า ปากกา ซื้อจากตัวแทนจำหน่าย A, สินค้าดินสอซื้อจาก  ตัวแทนจำหน่าย B เป็นต้น

 

เมื่อเรานำข้อมูลดังกล่าวมาใช้ในโลกของการโปรแกรมมิ่งแล้ว สิ่งที่นักพัฒนาทุกคนต้องนึกถึงเป็นอันดับแรก คือการป้อนข้อมูลให้ถูกต้องให้กับระบบเป็นสิ่งจำเป็นมาก เพราะระบบเป็นเพียงระบบ ไม่ฉลาดพอ ป้อนอะไรลงไป มันก็ให้ผลสิ่งนั้นออกมา มันไม่สามารถรับรู้ได้ว่า ข้อมูลที่ป้อนเข้าถูกหรือผิด ฉะนั้นจึงตกเป็นหน้าที่ของนัพัฒนาที่ต้องกรองความถูกต้องของข้อมูลดังกล่าวก่อนที่ข้อมูลเหล่านั้นจะไหลเข้าสู่ระบบ ยกตัวอย่างเช่น การจัดการข้อมูล Product เนื่องจากข้อมูล Product มีความสัมพันธ์กับข้อมูล Category และ Supplier แน่นอนในการป้อนข้อมูลสินค้าเข้าระบบ โดยเฉพาะ Category และ Supplier ถ้าเราปล่อยให้ผู้ใช้งานป้อนข้อมูลเหล่านั้นด้วยตัวเองความผิดพลาดย่อมมีโอกาสเกิดสูง ฉะนั้นระบบส่วนใหญ่จะให้ผู้ใช้งานเลือกจากหน้าจอ เช่นเลือกรายการจาก ComboBox เป็นต้น ท่านผู้อ่านที่เคยพัฒนา WinApp หรือ WebApp มาคงรู้จักดี บน Silverlight ก็มีคอนโทรล ComboBox ให้ใช้งานดังกล่าวได้เช่นกัน โดยตัวอย่างที่ผู้เขียนกำลังนำเสนอนี้เป็นการสร้าง ComboBox บน DataForm โดยใช้ตัวอย่างข้อมูล Product จากฐานข้อมูลตัวอย่าง Northwind ตัวอย่างหน้าจอแอปพลิเคชัน แสดงดังรูป

2

 

เราสามารถเลือกรายการประเภทสินค้าจาก ComboBox ได้

3

 

เราสามารถเลือกรายการผู้แทนจำหน่าย(Supplier) จาก ComboBox ได้

4

 

หมายเหตุ

ในบทความนี้ผู้เขียนไม่กล่าวถึงการสร้างโปรเจ็กต์, ADO.NET Entity Data Model, Domain Service Class ให้ติดตามได้จากบทความก่อนหน้านี้

การใส่โค้ด:

1. สร้าง ComboBox

 //สร้าง ComboBox
        private void dataForm1_AutoGeneratingField(object sender, DataFormAutoGeneratingFieldEventArgs e)
        {
            //สร้าง ComboBox Category
            if (e.PropertyName == "Category")
            {
                ComboBox cobCate = new ComboBox { DisplayMemberPath = "CategoryName" };
                Binding itemsSource = new Binding("Categories") { Source = this.productDomainDataSource.DomainContext };
                Binding selectedItem = new Binding("Category") { Mode = BindingMode.TwoWay };
                cobCate.SetBinding(ComboBox.ItemsSourceProperty, itemsSource);
                cobCate.SetBinding(ComboBox.SelectedItemProperty, selectedItem);
                DataField cateField = new DataField { Content = cobCate, Label = e.Field.Label };

                e.Field = cateField;

            }

            //สร้าง ComboBox Supplier
            if (e.PropertyName == "Supplier")
            {
                ComboBox cobSupp = new ComboBox { DisplayMemberPath = "CompanyName" };
                Binding itemsSource = new Binding("Suppliers") { Source = this.productDomainDataSource.DomainContext };
                Binding selectedItem = new Binding("Supplier") { Mode = BindingMode.TwoWay };
                cobSupp.SetBinding(ComboBox.ItemsSourceProperty, itemsSource);
                cobSupp.SetBinding(ComboBox.SelectedItemProperty, selectedItem);
                DataField suppField = new DataField { Content = cobSupp, Label = e.Field.Label };

                e.Field = suppField;

            }
        }

2. โหลดข้อมูล Category และ Supplier

        public Home()
        {
            InitializeComponent();
            NorthwindDomainContext context = (NorthwindDomainContext)this.productDomainDataSource.DomainContext;
            context.Load(context.GetCategoriesQuery());//โหลดข้อมูล Category
            context.Load(context.GetSuppliersQuery());//โหลดข้อมูล Supplier
        }

 

3. บันทึกข้อมูล

        private void SaveButton_Click(object sender, RoutedEventArgs e)
        {
            dataForm1.CommitEdit();
            productDomainDataSource.SubmitChanges();
        }

4. ยกเลิกข้อมูล

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            productDomainDataSource.RejectChanges();
        }

 

 

แหล่งข้อมูลอ้างอิง:

 

แหล่งข้อมูลดาวน์โหลด: (SL4RC)
http://cid-7d608959d854cb28.skydrive.live.com/embedicon.aspx/SourcesCode/03-22-2010_SL4RcAppDataFormComboBox.zip

ผู้เขียน:
nano_mvp_2009_1

Advertisements
เกี่ยวกับ

Nuchit Atjanawat is a Microsoft MVP, GreatFriends Community Leader, WindowsITPro Columnist(Mr.Nano), Silverlight Business Application Instructor, Speaker in various Microsoft events, Author, passionate Blogger and a Software Engineer by profession. He has a very good skill over Silverlight, LightSwitch, C#, XAML & Blend. He shares his technical findings, tutorials in his technical blog. Follow his Blog and Facebook page to be updated on latest articles. - Technical Blog: https://janawat.wordpress.com - WindowsITPro Columnist(Mr.Nano): http://windowsitpro.net - The GreatFriends.Biz Community Discussion Board (nano): http://greatfriends.biz - witter: https://twitter.com/janawat - Facebook Page: https://www.facebook.com/nuchit - Instructor: http://bit.ly/GF250-01, http://bit.ly/GF150-02

เขียนใน RIA Services
2 comments on “WCF RIA DataForm ComboBox
  1. yoke พูดว่า:

    ทำไมผมทำตามแล้วมันไม่มีข้อมูลอะไรเลยล่ะครับในช่อง combo boxช่วยอธิบายความหมายตรงนี้หน่อยครับ ผมงง if (e.PropertyName == "Category") { ComboBox cobCate = new ComboBox { DisplayMemberPath = "CategoryName" }; Binding itemsSource = new Binding("Categories") { Source = this.productDomainDataSource.DomainContext }; Binding selectedItem = new Binding("Category") { Mode = BindingMode.TwoWay }; cobCate.SetBinding(ComboBox.ItemsSourceProperty, itemsSource); cobCate.SetBinding(ComboBox.SelectedItemProperty, selectedItem); DataField cateField = new DataField { Content = cobCate, Label = e.Field.Label }; e.Field = cateField; }โหลด Solution ของท่านไปแล้วแต่ว่า run แล้ว error ครับ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

In Archive
%d bloggers like this: