如何将组合框数据源绑定到Windows窗体中的窗体/列表框?

拉梅什

组合框数据源作为表单/列表框

单击组合框时,我希望将表单作为数据源。我怎么能做到这一点。请给个建议。

乔恩

我创建了一个PopupComboBox类,该类继承自标准Windows Forms ComboBox。它具有您可以设置的Title属性,单击该组合时将在弹出窗口中使用该属性。

public class PopupComboBox : ComboBox
    {
        private string title;
        public string Title
        {
            get { return this.title; }
            set { this.title = value; }
        }
        public PopupComboBox() : base()
        {

        }

        public PopupComboBox (string title)
            : base()
        {
            this.title = title;
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);

            // Show the popup form
            var popup = new SelectItemForm(this.title, this);
            var result = popup.ShowDialog(this);

            if (result == DialogResult.OK)
            {
                // Select this item in the ComboBox
                SelectedIndex = this.FindStringExact(popup.SelectedDisplay);
            }
        }
    }

当您单击组合时,将弹出一个表单(下面是SelectItemForm的源代码)。它使用父PopupComboBox的DataSource,ValueMember和DisplayMember用组合中的项目列表填充ListView。当您单击“确定”时,它将选择的项目保存在SelectedValue和SelectedDisplay属性中,以便在窗体关闭时我们可以在ComboBox中选择该项目。

弹出表单

public partial class SelectItemForm : Form
    {
        public object SelectedValue { get; private set; }
        public string SelectedDisplay { get; private set; }

        public SelectItemForm(string title, PopupComboBox parent)
            :base()
        {
            InitializeComponent();

            this.Text = title;

            // Add items to the list
            foreach (var item in parent.Items)
            {
                // Get the display and value member properties for this combo box
                // and use them for the Code/Name columns in the popup form
                var props = item.GetType().GetProperties();
                var code = props.Where(p => p.Name == parent.ValueMember).Single().GetValue(item);
                var name = props.Where(p => p.Name == parent.DisplayMember).Single().GetValue(item);

                listView.Items.Add(new ListViewItem(
                    new string[] { code.ToString(), name.ToString() }));
            }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            if (listView.SelectedItems != null && listView.SelectedItems.Count > 0)
            {
                SelectedValue = listView.SelectedItems[0].Text;
                SelectedDisplay = listView.SelectedItems[0].SubItems[1].Text;

                DialogResult = DialogResult.OK;
            }
            else
            {
                MessageBox.Show(this, "Select an item first", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }
    }

这是表单的设计器部分,您可以在其中查看为ListView更改后我更改了哪些属性:

partial class SelectItemForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.listView = new System.Windows.Forms.ListView();
            this.btnOk = new System.Windows.Forms.Button();
            this.btnCancel = new System.Windows.Forms.Button();
            this.Code = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
            this.Value = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
            this.SuspendLayout();
            // 
            // listView
            // 
            this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
            this.Code,
            this.Value});
            this.listView.FullRowSelect = true;
            this.listView.GridLines = true;
            this.listView.Location = new System.Drawing.Point(3, 3);
            this.listView.MultiSelect = false;
            this.listView.Name = "listView";
            this.listView.Size = new System.Drawing.Size(432, 170);
            this.listView.TabIndex = 0;
            this.listView.UseCompatibleStateImageBehavior = false;
            this.listView.View = System.Windows.Forms.View.Details;
            // 
            // btnOk
            // 
            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnOk.Location = new System.Drawing.Point(272, 179);
            this.btnOk.Name = "btnOk";
            this.btnOk.Size = new System.Drawing.Size(75, 23);
            this.btnOk.TabIndex = 1;
            this.btnOk.Text = "OK";
            this.btnOk.UseVisualStyleBackColor = true;
            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
            // 
            // btnCancel
            // 
            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnCancel.Location = new System.Drawing.Point(353, 179);
            this.btnCancel.Name = "btnCancel";
            this.btnCancel.Size = new System.Drawing.Size(75, 23);
            this.btnCancel.TabIndex = 2;
            this.btnCancel.Text = "Cancel";
            this.btnCancel.UseVisualStyleBackColor = true;
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
            // 
            // Code
            // 
            this.Code.Text = "Code";
            this.Code.Width = 108;
            // 
            // Value
            // 
            this.Value.Text = "Name";
            this.Value.Width = 296;
            // 
            // SelectItemForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(440, 214);
            this.Controls.Add(this.btnCancel);
            this.Controls.Add(this.btnOk);
            this.Controls.Add(this.listView);
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "SelectItemForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
            this.Text = "Title";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.ListView listView;
        private System.Windows.Forms.Button btnOk;
        private System.Windows.Forms.Button btnCancel;
        private System.Windows.Forms.ColumnHeader Code;
        private System.Windows.Forms.ColumnHeader Value;
    }

我还创建了一个小型测试表单,您可以在其中使用一小部分产品来测试PopupComboBox的功能。您需要在设计器中的窗体中添加一个PopupComboBox,并将其称为comboPopup。

public partial class TestForm : Form
    {
        public class Product
        {
            public string Code { get; set; }
            public string Name { get; set; }
        }

        public TestForm()
        {
            InitializeComponent();
        }

        private void TestForm_Load(object sender, EventArgs e)
        {
            var products = new List<Product>();
            products.Add(new Product { Code = "0001", Name = "Coca Cola" });
            products.Add(new Product { Code = "0002", Name = "Mountain Dew" });
            products.Add(new Product { Code = "0003", Name = "Sprite Zero" });

            comboPopup.DataSource = products;
            comboPopup.DisplayMember = "Name";
            comboPopup.ValueMember = "Code";

        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

列表框绑定到数据源(SQL Server数据库)后为空:C#,Windows窗体

来自分类Dev

使用父窗体中的组合框到子窗体中的列表框输入带有数据的查询

来自分类Dev

如何从文本框输入中填充用户窗体列表框/组合框数组/列表?

来自分类Dev

如何将文本框中的字体大小绑定到数据源?

来自分类Dev

将组合框元素绑定到数据源

来自分类Dev

将组合框元素绑定到数据源

来自分类Dev

如何将Windows窗体设计器生成的组合框放入数组中

来自分类Dev

如何在Windows窗体上将数据源动态绑定到reportviewer C#

来自分类Dev

如何将命令绑定到列表框项目?

来自分类Dev

VB中数据源中的重复项绑定检查列表框

来自分类Dev

从列表框中的数据导入到另一个窗体

来自分类Dev

如何将数据从列表插入到列表框?

来自分类Dev

在C#Windows窗体中绑定组合框

来自分类Dev

如何刷新列表框的数据源

来自分类Dev

如何在ac#Windows窗体应用程序的列表框中显示结构的内容

来自分类Dev

如何在ac#Windows窗体应用程序的列表框中显示结构的内容

来自分类Dev

如何将数据源绑定到PowerApps中的下拉列表

来自分类Dev

如何将列表框中的选定项目绑定到查询(MS Access)?

来自分类Dev

将记录添加到绑定到数据源的组合框

来自分类Dev

如何将自定义对象列表作为源绑定到列表框?

来自分类Dev

如何将文本框绑定到MS Access中子窗体的链接子字段?

来自分类Dev

如何将数据从MySql数据库(WPF)中的表绑定到组合框

来自分类Dev

如何将数据从MySql数据库(WPF)中的表绑定到组合框

来自分类Dev

将Windows窗体中的DataGridView绑定到列表<List <T >>

来自分类Dev

如何将组合框值与列表框中的项目进行比较-vb.net

来自分类Dev

同时滚动两个列表框(Windows窗体)

来自分类Dev

Windows窗体列表框按日期排序

来自分类Dev

将组合框数据源设置为列表中存储的对象的特定属性

来自分类Dev

如何将数据从xml标记绑定到xamdatagrid或wpf中的datagrid的组合框?

Related 相关文章

  1. 1

    列表框绑定到数据源(SQL Server数据库)后为空:C#,Windows窗体

  2. 2

    使用父窗体中的组合框到子窗体中的列表框输入带有数据的查询

  3. 3

    如何从文本框输入中填充用户窗体列表框/组合框数组/列表?

  4. 4

    如何将文本框中的字体大小绑定到数据源?

  5. 5

    将组合框元素绑定到数据源

  6. 6

    将组合框元素绑定到数据源

  7. 7

    如何将Windows窗体设计器生成的组合框放入数组中

  8. 8

    如何在Windows窗体上将数据源动态绑定到reportviewer C#

  9. 9

    如何将命令绑定到列表框项目?

  10. 10

    VB中数据源中的重复项绑定检查列表框

  11. 11

    从列表框中的数据导入到另一个窗体

  12. 12

    如何将数据从列表插入到列表框?

  13. 13

    在C#Windows窗体中绑定组合框

  14. 14

    如何刷新列表框的数据源

  15. 15

    如何在ac#Windows窗体应用程序的列表框中显示结构的内容

  16. 16

    如何在ac#Windows窗体应用程序的列表框中显示结构的内容

  17. 17

    如何将数据源绑定到PowerApps中的下拉列表

  18. 18

    如何将列表框中的选定项目绑定到查询(MS Access)?

  19. 19

    将记录添加到绑定到数据源的组合框

  20. 20

    如何将自定义对象列表作为源绑定到列表框?

  21. 21

    如何将文本框绑定到MS Access中子窗体的链接子字段?

  22. 22

    如何将数据从MySql数据库(WPF)中的表绑定到组合框

  23. 23

    如何将数据从MySql数据库(WPF)中的表绑定到组合框

  24. 24

    将Windows窗体中的DataGridView绑定到列表<List <T >>

  25. 25

    如何将组合框值与列表框中的项目进行比较-vb.net

  26. 26

    同时滚动两个列表框(Windows窗体)

  27. 27

    Windows窗体列表框按日期排序

  28. 28

    将组合框数据源设置为列表中存储的对象的特定属性

  29. 29

    如何将数据从xml标记绑定到xamdatagrid或wpf中的datagrid的组合框?

热门标签

归档