Add DataSource Property to WinForms User Control

I want to add a complex data binding to my winforms user control, so I can do the following:

myControl.DisplayMember = "Name";
myControl.ValueMember = "Name";
myControl.DataSource = new List<someObject>();

Does anyone know which interfaces, etc. must be implemented to achieve this?

I looked through it, and all I found is that IBindableComponent, but it looks like a simple binding, not a complex binding.

+4
source share
3 answers

Apply one of the following attributes to your custom control, depending on what type of data binding you need:

( , , .)

.NET Framework:


, (, DataGridView, ListBox ComboBox) , , . ( , .) Microsoft :

, , , , List<T>. .


Windows Forms Visual Studio UserControl.

ComplexBindingPropertiesAttribute ComplexBindingPropertiesAttribute . DataGridView DataGridView. DataSource DataMember DataGridView.

// ComplexBindingControl.cs
// Adapted from https://docs.microsoft.com/visualstudio/data-tools/create-a-windows-forms-user-control-that-supports-complex-data-binding

using System.ComponentModel;
using System.Windows.Forms;

namespace BindingDemo
{
    [ComplexBindingProperties("DataSource", "DataMember")]
    public partial class ComplexBindingControl : UserControl
    {
        public ComplexBindingControl()
        {
            InitializeComponent();
        }

        // Use a DataGridView for its complex data binding implementation.

        public object DataSource
        {
            get => dataGridView1.DataSource;
            set => dataGridView1.DataSource = value;
        }

        public string DataMember
        {
            get => dataGridView1.DataMember;
            set => dataGridView1.DataMember = value;
        }
    }
}

LookupBindingPropertiesAttribute LookupBindingPropertiesAttribute . ComboBox ListBox ComboBox . DataSource, DisplayMember, ValueMember LookupMember ListBox ComboBox.

// LookupBindingControl.cs
// Adapted from https://docs.microsoft.com/visualstudio/data-tools/create-a-windows-forms-user-control-that-supports-lookup-data-binding

using System.ComponentModel;
using System.Windows.Forms;

namespace BindingDemo
{
    [LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "LookupMember")]
    public partial class LookupBindingControl : UserControl
    {
        public LookupBindingControl()
        {
            InitializeComponent();
        }

        // Use a ListBox or ComboBox for its lookup data binding implementation.

        public object DataSource
        {
            get => listBox1.DataSource;
            set => listBox1.DataSource = value;
        }

        public string DisplayMember
        {
            get => listBox1.DisplayMember;
            set => listBox1.DisplayMember = value;
        }

        public string ValueMember
        {
            get => listBox1.ValueMember;
            set => listBox1.ValueMember = value;
        }

        public string LookupMember
        {
            get => listBox1.SelectedValue.ToString();
            set => listBox1.SelectedValue = value;
        }
    }
}

, Visual Studio, Form. , .

// Form1.cs

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

namespace BindingDemo
{
    public partial class Form1 : Form
    {
        private readonly List<SomeObject> data;

        public Form1()
        {
            InitializeComponent();

            // Prepare some sample data.
            data = new List<SomeObject>
            {
                new SomeObject("Alice"),
                new SomeObject("Bob"),
                new SomeObject("Carol"),
            };

            // Bind the data to your custom control...

            // ...for "complex" data binding:
            complexBindingControl1.DataSource = data;

            // ...for "lookup" data binding:
            lookupBindingControl1.DataSource = data;
            lookupBindingControl1.DisplayMember = "Name";
            lookupBindingControl1.ValueMember = "Name";
        }
    }

    internal class SomeObject
    {
        public SomeObject(string name)
        {
            Name = name;
        }

        public string Name { get; set; }
    }
}
+3

DataBoundControl UserControl.

0

To run Chris Tollefson’s very useful example without problems, place a try / catch block around the LookupMember getter as follows:

public string LookupMember {
        get {
            try {
                return listBox1.SelectedValue.ToString();
            }
            catch { return null; }
    }
        set => listBox1.SelectedValue = value;
    }
0
source

Source: https://habr.com/ru/post/1698838/


All Articles