【问题标题】:datagridview in winform, columncombobox value changewinform中的datagridview,columncombobox值变化
【发布时间】:2021-11-03 09:30:32
【问题描述】:

我正在设计一个 winform,其中我有一个带有预定义列的 datagridview,第一列是组合框,其余 3 列是文本框。 我没有将 datagridview 绑定到任何数据源,因为用户要填充最后一列“数量”,我想要实现的是,当用户单击组合框时,它应该显示数据库表中的 3 列(项目代码、项目名称和 uom),当用户选择任何特定的“项目代码”时,对应的“项目名称”和“uom”应显示在 datagridview 的第二列和第三列。同样,用户应该能够根据需要输入尽可能多的行。数据输入后,数据将保存在名为“采购申请”的表中。 到目前为止,我还没有进行任何编码,只设计了表单。

【问题讨论】:

    标签: c# winforms datagridcomboboxcolumn datagridviewcomboboxcell


    【解决方案1】:

    看看下面的代码是否会提供滚动的基本代码。有几个类可以模拟数据和一个扩展方法,应该移动到自己的文件中。

    DataGridView 没有在设计器中配置,只是在代码中。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace UnboundDataGridViewComboBox
    {
        public partial class Form1 : Form
        {
    
            private ComboBox _cbo;
            private string _comboColumnName = "ItemCodeColumn";
            private List<Item> _items => Mocked.Items;
            
            public Form1()
            {
                InitializeComponent();
                Shown += OnShown;
            }
    
            private void OnShown(object sender, EventArgs e)
            {
                var column1 = new DataGridViewComboBoxColumn
                {
                    DataSource = _items.Select(x => x.ItemCode).ToArray(),
                    DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing,
                    Name = _comboColumnName,
                    HeaderText = "Item Code",
                    SortMode = DataGridViewColumnSortMode.NotSortable
                };
    
                var column2 = new DataGridViewTextBoxColumn
                {
                    Name = "ItemNameColumn",
                    HeaderText = "Item Name"
                };
                var column3 = new DataGridViewTextBoxColumn
                {
                    Name = "UomColumn",
                    HeaderText = "UOM"
                };
    
                var column4 = new DataGridViewTextBoxColumn
                {
                    Name = "QuanityColumn",
                    HeaderText = "Quanity"
                };
    
                ItemsDataGridView.Columns.AddRange(column1, column2, column3, column4);
                ItemsDataGridView.EditingControlShowing += DataGridView1OnEditingControlShowing;
            }
    
            private void DataGridView1OnEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (!ItemsDataGridView.CurrentCell.IsComboBoxCell()) return;
                if (ItemsDataGridView.Columns[ItemsDataGridView.CurrentCell.ColumnIndex].Name != _comboColumnName) return;
    
                _cbo = e.Control as ComboBox;
                _cbo.SelectedIndexChanged -= ItemCodeColumnComboSelectionChanged;
                _cbo.SelectedIndexChanged += ItemCodeColumnComboSelectionChanged;
            }
    
            private void ItemCodeColumnComboSelectionChanged(object sender, EventArgs e)
            {
                DataGridViewComboBoxEditingControl control = sender as DataGridViewComboBoxEditingControl;
                Item item = _items.FirstOrDefault(x => x.ItemCode == control.EditingControlFormattedValue.ToString());
                if (item == null)
                {
                    return;
                }
                ItemsDataGridView.CurrentRow.Cells[1].Value = item.Name;
                ItemsDataGridView.CurrentRow.Cells[2].Value = item.UOM;
    
            }
        }
    
        #region Place classes into their own files
    
        public static class Extensions
        {
            public static bool IsComboBoxCell(this DataGridViewCell sender)
                => sender.EditType != null && 
                   sender.EditType == typeof(DataGridViewComboBoxEditingControl);
        }
    
        // represents a table in a database
        public class Item
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string ItemCode { get; set; }
            public string UOM { get; set; }
            public override string ToString() => ItemCode;
        }
    
        class Mocked
        {
            // simulate data from database
            public static List<Item> Items => new List<Item>()
            {
                new Item() {Id = 1,Name = "P1", ItemCode = "A100", UOM = "Q1"},
                new Item() {Id = 2,Name = "P2", ItemCode = "A200", UOM = "W1"},
                new Item() {Id = 3,Name = "P3", ItemCode = "A300", UOM = "B1"},
                new Item() {Id = 4,Name = "P4", ItemCode = "A400", UOM = "H1"}
            };
        }
    
        #endregion
    }
    

    【讨论】:

    • 这真的拯救了我的一天@Karen,这正是我想要的。现在我有了示例代码,我只需要更改它以从数据库中获取数据。非常感谢你,你太棒了。
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多