Переключатель привязки WinForm - PullRequest
17 голосов
/ 18 января 2012

Я использую VS2010, а затем перетаскиваю элемент сетки данных членов в представление конструктора. После этого я перетаскиваю текстовое поле имени члена в представление конструктора, а затем пытаюсь отредактировать и сохранить. Это работает правильно.

А потом я перетаскиваю кнопку-переключатель для просмотра дизайна. Но привязка не работает.

Как я могу связать в этой ситуации?

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

Ответы [ 3 ]

15 голосов
/ 19 января 2012

Вот два возможных решения.


Формат привязки и события Parse

Класс Binding имеет встроенную функцию дляпреобразования связанных данных в форме Format и Parse events.

Вот как вы можете использовать эти события только с радиокнопкой «Male».Создайте привязку в коде, а не в конструкторе:

// 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;

Вычисляемое свойство

Другой подход заключается в добавлении вычисляемого свойства в ваш источник данных:

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

Теперь вы можете просто привязать радиокнопку Male к этому свойству в вашем источнике данных (просто не отображать это свойство в сетке).

И снова вы можете подключить самку к самцувот так:

maleRb.CheckedChanged += (s, args) => femaleRb.Checked = !maleRb.Checked;
2 голосов
/ 28 августа 2012

Хотя я понимаю, что на этот вопрос уже дан ответ, я подумал, что предоставлю опцию, которая дает возможность привязки времени проектирования.

Создайте новый пользовательский объект RadioButton. Это делается с помощью следующего кода.

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;
        }
    }
}

Основная концепция вышеприведенного элемента управления - использовать строковое значение, которое может быть связано, и проверит себя, равно ли значение связанной строки тексту переключателя.

Использование текста переключателя позволяет легко понять правильное проверенное значение, а также позволяет обновлять SelectValue, просто изменяя текст переключателя. При изменении переключателя дополнительный код не требуется.

Теперь вы просто привязываете свойство SelectedValue для всех переключателей в одной группе к какому-либо строковому свойству.

Ограничения:

  1. Две радиокнопки в одной группе не могут иметь одинаковый текст (но действительно ли это ограничение?)
  2. Во время разработки проверенные значения переключателей могут отображаться неточно (т. Е. Могут быть проверены две переключатели в одной группе). Однако это не должно происходить во время выполнения.

Примечание при создании пользовательского элемента управления проект должен быть создан до того, как пользовательский объект будет доступен на панели инструментов.

0 голосов
/ 23 мая 2017

При создании форм вы можете перетаскивать элементы с панели «Источники данных». На панели источников данных вы можете перетащить класс или таблицу и все ее дочерние элементы в форму и автоматически сгенерировать текстовое поле или в этом случае переключатель с привязкой данных. В базе данных или классе вы должны будете сделать бит / bool для каждого параметра.

Сгруппируйте переключатели и добавьте переключатель без привязки данных, чтобы сохранить все биты / bools 0.

Установите CausesValidation в False для всех переключателей.

При сохранении изменений переключайтесь между всеми переключателями, например:

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

Я думаю, что это копия Как использовать привязку данных с переключателями Windows Forms? И поэтому здесь есть копия моего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...