Переключатель привязки WinForm - программирование
Подтвердить что ты не робот

Переключатель привязки WinForm

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

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

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

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

4b9b3361

Ответ 1

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


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

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

Здесь вы можете использовать эти события только с помощью радиомаяка "Мужской". Создайте привязку в коде, а не в дизайнере:

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

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

Создайте новый пользовательский объект 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 для всех переключателей в той же группе к некоторому строковому свойству.

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

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

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

Ответ 3

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

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

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

При сохранении цикла изменений все переключатели, такие как:

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

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