Переключатель привязки 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]()
Ответы
Ответ 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? И, следовательно, вот копия моего ответа там.