2012-01-18 36 views
16

Tôi sử dụng VS2010 và sau đó kéo và thả Thành phần dữ liệu thống kê để xem thiết kế. Sau đó, tôi kéo và thả tên thành viên của trường thành dạng xem thiết kế và sau đó thử chỉnh sửa và lưu. Nó hoạt động đúng.Nút radio gắn kết WinForm

Và sau đó tôi kéo và thả nút radio giới tính để thiết kế giao diện. Nhưng ràng buộc nó không hoạt động.

Làm cách nào để tôi có thể ràng buộc trong trường hợp này?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Test7 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void memberBindingNavigatorSaveItem_Click(object sender, EventArgs e) 
     { 
      this.Validate(); 
      this.memberBindingSource.EndEdit(); 
      this.tableAdapterManager.UpdateAll(this.dbDataSet); 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // TODO: This line of code loads data into the 'dbDataSet.Member' table. You can move, or remove it, as needed. 
      this.memberTableAdapter.Fill(this.dbDataSet.Member); 
      // TODO: This line of code loads data into the 'dbDataSet.Member' table. You can move, or remove it, as needed. 
      this.memberTableAdapter.Fill(this.dbDataSet.Member); 

     } 


     private void memberBindingNavigatorSaveItem_Click_1(object sender, EventArgs e) 
     { 
      this.Validate(); 
      this.memberBindingSource.EndEdit(); 
      this.tableAdapterManager.UpdateAll(this.dbDataSet); 

     } 
    } 
} 

enter image description here

+0

Sự khác nhau giữa memberBindingNavigatorSaveItem_Click và memberBindingNavigatorSaveItem_Click_1 là gì? Tui bỏ lỡ điều gì vậy? 1 cho thời gian để đăng mã và ảnh chụp màn hình mặc dù. – CptSupermrkt

+0

Không có sự khác biệt giữa hai sự kiện đó, bạn đã tạo sự kiện Nhấp chuột mới khi đã có sự kiện. –

+0

vâng, không có sự khác biệt. –

Trả lời

14

Dưới đây là hai giải pháp khả thi.


Binding Format và Phân tích sự kiện

Lớp Binding có một cơ sở được xây dựng-in cho on-the-fly biến đổi dữ liệu ràng buộc trong các hình thức của FormatParse sự kiện.

Dưới đây là cách bạn sẽ sử dụng những sự kiện đó chỉ với radio "Male". Tạo các ràng buộc trong mã, không phải trong thiết kế:

// create binding between "Sex" property and RadioButton.Checked property 
var maleBinding = new Binding("Checked", bindingSource1, "Sex"); 
// when Formatting (reading from datasource), return true for M, else false 
maleBinding.Format += (s, args) => args.Value = ((string)args.Value) == "M"; 
// when Parsing (writing to datasource), return "M" for true, else "F" 
maleBinding.Parse += (s, args) => args.Value = (bool)args.Value ? "M" : "F"; 
// add the binding 
maleRb.DataBindings.Add(maleBinding); 

// you don't need to bind the Female radiobutton, just make it do the opposite 
// of Male by handling the CheckedChanged event on Male: 
maleRb.CheckedChanged += (s, args) => femaleRb.Checked = !maleRb.Checked; 

Điện Toán tài sản

Một cách khác là để thêm một tài sản tính đến nguồn dữ liệu của bạn:

public bool IsMale 
{ 
    get { return Sex == "M"; } 
    set 
    { 
     if (value) 
      Sex = "M"; 
     else 
      Sex = "F"; 
    } 
} 

Bây giờ bạn có thể chỉ cần liên kết radio nam với thuộc tính này trên nguồn dữ liệu của bạn (chỉ cần không hiển thị thuộc tính này trong lưới).

Và một lần nữa, bạn có thể treo lên Nữ tới Nam như sau:

maleRb.CheckedChanged += (s, args) => femaleRb.Checked = !maleRb.Checked; 
+1

Tôi thử giải pháp # 1 và nếu tôi đặt tất cả các bản ghi là nữ, nó sẽ không có nút radio nào được chọn. [http://i.imgur.com/zo2KF.jpg] –

+0

Giải pháp # 2, tôi có thể thêm mã vào đâu? –

+0

Tôi cũng đã giải quyết bằng cách gắn nút nữ. –

2

Trong khi tôi nhận ra điều này đã được trả lời, tôi nghĩ tôi sẽ cung cấp một tùy chọn cho phép thời gian thiết kế khả năng ràng buộc.

Tạo đối tượng Nút radio tùy chỉnh mới. Điều này được thực hiện với mã sau đây.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace MSLabExample 
{ 
    class RadioButtonBind : RadioButton 
    { 
     private string _selectValue = string.Empty; 
     public string SelectValue 
     { 
      get { return _selectValue; } 
      set 
      { 
       if (value == Text) Checked = true; 
       else Checked = false; 
       _selectValue = value; 
      } 
     } 

     public RadioButtonBind() 
     { 
      this.CheckedChanged += new EventHandler(RadioButtonBind_CheckedChanged); 
      this.TextChanged += new EventHandler(RadioButtonBind_TextChanged); 

     } 
     void RadioButtonBind_TextChanged(object sender, EventArgs e) 
     { 
      if (Checked) _selectValue = Text; 
     } 

     void RadioButtonBind_CheckedChanged(object sender, EventArgs e) 
     { 
      if (Checked) _selectValue = Text; 
     } 
    } 
} 

Khái niệm cơ bản của điều khiển trên là sử dụng một giá trị chuỗi có thể bị ràng buộc và sẽ kiểm tra bản thân nếu giá trị chuỗi ràng buộc bằng văn bản nút radio.

Bằng cách sử dụng văn bản nút radio, nó cho phép dễ dàng hiểu giá trị được kiểm tra thích hợp và cũng cho phép cập nhật SelectValue bằng cách thay đổi văn bản nút radio. Không cần thêm mã khi sửa đổi nút radio.

Bây giờ bạn chỉ cần gắn kết thuộc tính SelectedValue cho tất cả các nút radio trong cùng một nhóm với một số thuộc tính chuỗi.

Hạn chế:

  1. Hai nút radio trong cùng một nhóm không thể có cùng nội dung (? Nhưng là này thực sự là một hạn chế)
  2. Tại thời gian thiết kế, các giá trị kiểm tra các nút radio có thể không xuất hiện chính xác (tức là hai nút radio trong cùng một nhóm có thể xuất hiện để được kiểm tra). Điều này sẽ không xảy ra trong thời gian chạy.

Note khi tạo một điều khiển tùy chỉnh, dự án phải được xây dựng trước khi các đối tượng tùy chỉnh có sẵn trong hộp công cụ.

0

Khi tạo biểu mẫu, bạn có thể kéo các mục từ bảng "Nguồn dữ liệu". Trong bảng dữ liệu nguồn bạn có thể một lớp hoặc bảng và tất cả các con của nó có thể được kéo vào biểu mẫu và sẽ tự động tạo ra một hộp văn bản hoặc trong trường hợp này một nút radio với một ràng buộc dữ liệu. Trong cơ sở dữ liệu hoặc lớp, bạn sẽ phải tạo một bit/bool cho mọi tùy chọn.

Nhóm các nút radio và thêm một nút radio mà không có một liên kết dữ liệu để giữ tất cả các bit/bools 0.

Set CausesValidation False cho tất cả các nút radio.

Khi lưu vòng lặp thay đổi thông qua tất cả các nút radio như:

((YourClass)myBindingSource.DataSource).property1 = radioButton1.Checked; 
((YourClass)myBindingSource.DataSource).property2 = radioButton2.Checked; 

Tôi nghĩ rằng đây là một bản sao của How do I use databinding with Windows Forms radio buttons? Và do đó, đây là một bản sao của câu trả lời của tôi ở đó.