Winform实现在DataGridView控件的单元格中添加多个控件

article/2025/11/1 1:51:06

Winform实现在DataGridView控件的单元格中添加多个控件

  • 背景
  • 实现思路
  • 关键代码
  • 完整代码下载

背景

DataGridView控件的列是支持TextBoxColumn、ComboBoxColumn等类型的,就是DataGridView的单元格进入编辑模式的时候就会出现对应的控件,但是有些业务场景是需要在一个单元格进入编辑状态时需要多个控件组合完成业务需求,就无法直接只用特定类型的Column来实现了。如下图:
在这里插入图片描述

在这里插入图片描述

实现思路

这种需求就不能使用ComboBoxColumn的方式来实现了,也不需要进入编辑状态,可以通过在DataGridView的Controls中添加需要的控件来实现。

关键代码

DataGridViewHelper.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;namespace DXApplication1.Helper2
{using Wongoing.Entity;/// <summary>/// 网格控件辅助类/// </summary>public class DataGridViewHelper{#region 字段定义private static int RowHeight = 30;                          //保留默认行号private static int LastVerticalScrollingOffset = 0;         //保留最后垂直滚动条的位置private static int LastHorizontalScrollingOffset = 0;           //保留最后水平滚动条的位置#endregion#region 设置网格控件样式/// <summary>/// 设置网格控件样式/// </summary>/// <param name="dataGridView">网格控件对象</param>public static void SetStyle(DataGridView dataGridView){#region 启用双缓冲解决大数据闪烁问题Type dgvType = dataGridView.GetType();PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);pi.SetValue(dataGridView, true, null);#endregion#region 只读、尾行、删除、排序、行高、列宽dataGridView.ReadOnly = true;                               //设置为只读dataGridView.AllowUserToAddRows = false;                    //禁用自动添加尾行dataGridView.AllowUserToDeleteRows = false;                 //禁用删除dataGridView.AllowUserToOrderColumns = false;               //禁用排序dataGridView.AllowUserToResizeRows = false;                 //禁用调整行高    dataGridView.AllowUserToResizeColumns = false;              //禁用调整列宽dataGridView.AutoGenerateColumns = false;                   //禁用自动生成列dataGridView.RowTemplate.Height = RowHeight;                //行高#endregion#region 影响性能dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;     //禁用调整列宽dataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;             //禁用调整行高dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;                                //禁用列自动调整尺寸dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;                                      //禁用行高自动调整#endregion#region 网格线、选择模式//dataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None;                //禁用网格线//dataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;dataGridView.RowHeadersVisible = false;                                         //隐藏列头dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;           //整行选中dataGridView.MultiSelect = false;                                               //禁用选中多行#endregion#region 虚模式//dataGridView.VirtualMode = true;                                                 //开启虚模式#endregiondataGridView.BackgroundColor = System.Drawing.Color.White;                                  //设置控件背景色dataGridView.DefaultCellStyle.SelectionBackColor = System.Drawing.Color.YellowGreen;        //设置选中行的高亮背景色}#endregion#region 设置列/// <summary>/// 设置列/// </summary>/// <param name="dataGridView">网格控件对象</param>public static void SetColumns(DataGridView dataGridView){dataGridView.Columns.Clear();List<DataGridViewColumn> colList = new List<DataGridViewColumn>();DataGridViewTextBoxColumn col = null;#region 步号col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colStepNo";col.DataPropertyName = "StepNo";col.HeaderText = "步号";col.Width = 60;colList.Add(col);#endregion#region 控制模式col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colControlMode";col.DataPropertyName = "ControlMode";col.HeaderText = "控制模式";col.Width = 400;colList.Add(col);#endregion#region 跳转条件col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colGotoCondition";col.DataPropertyName = "GotoCondition";col.HeaderText = "跳转条件";col.Width = 300;colList.Add(col);#endregion#region 记录条件col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colRecordCondition";col.DataPropertyName = "RecordCondition";col.HeaderText = "记录条件";col.Width = 280;colList.Add(col);#endregion#region 电流量程col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colCurrentRange";col.DataPropertyName = "CurrentRange";col.HeaderText = "电流量程";col.Width = 80;colList.Add(col);#endregion#region 延迟col = new DataGridViewTextBoxColumn();col.ReadOnly = true;col.Name = "colDelay";col.DataPropertyName = "Delay";col.HeaderText = "延迟";col.Width = 60;colList.Add(col);#endregiondataGridView.Columns.AddRange(colList.ToArray());//if (dataGridView.Columns.Count < DataConfigHelper.Instance.MaxItemCount)//{//    //如果网格控件的列数比最大要显示的数据项数少,则增加列//    for (int i = dataGridView.Columns.Count; i < DataConfigHelper.Instance.MaxItemCount; i++)//    {//        col = new DataGridViewTextBoxColumn();//        col.ReadOnly = true;//        colList.Add(col);//    }//    dataGridView.Columns.AddRange(colList.ToArray());//}//else//{//    //如果网格控件的列数比最大要显示的数据项数多,则移除列//    int maxItemCount = DataConfigHelper.Instance.MaxItemCount;//    while(dataGridView.Columns.Count > maxItemCount)//    {//        dataGridView.Columns.RemoveAt(dataGridView.Columns.Count - 1);//    }//}}#endregion#region 设置列和列头/ <summary>/ 设置列和列头/ </summary>/ <param name="dataGridView">网格控件对象</param>/ <param name="type">列头对应的类型</param>//public static void SetColumnAndHeader(DataGridView dataGridView, Type type)//{//    List<DataItem> dataItems = DataConfigHelper.Instance[type];//    if (dataItems != null)//    {//        SetColumns(dataGridView);//        IOrderedEnumerable<DataItem> orderItems =  dataItems.Where(p => p.IsDisplay == true).OrderBy(p => p.DisplayIndex);//        DataItem[] items = orderItems.ToArray();//        for (int i = 0; i < dataGridView.Columns.Count; i++)//        {//            DataGridViewTextBoxColumn col = dataGridView.Columns[i] as DataGridViewTextBoxColumn;//            if (i < items.Length)//            {//                DataItem dataItem = items[i];//                col.Width = dataItem.DisplayWidth;//                col.DisplayIndex = i;//                dataItem.DisplayIndex = i;//                col.DataPropertyName = dataItem.DataPropertyName;//                col.HeaderText = dataItem.DisplayName;//            }//            else//            {//                col.HeaderText = String.Empty;//            }//        }//    }//}#endregion#region 为网格控件注册事件/// <summary>/// 为网格控件注册事件/// </summary>/// <param name="dataGridView">网格控件对象</param>public static void RegisterEvent(DataGridView dataGridView){dataGridView.DataBindingComplete -= dataGridView_DataBindingComplete;dataGridView.DataBindingComplete += dataGridView_DataBindingComplete;dataGridView.CellMouseClick -= dataGridView_CellMouseClick;dataGridView.CellMouseClick += dataGridView_CellMouseClick;dataGridView.CellLeave -= dataGridView_CellLeave;dataGridView.CellLeave += dataGridView_CellLeave;dataGridView.CurrentCellChanged -= dataGridView_CurrentCellChanged;dataGridView.CurrentCellChanged += dataGridView_CurrentCellChanged;dataGridView.Scroll -= dataGridView_Scroll;dataGridView.Scroll += dataGridView_Scroll;dataGridView.MouseClick -= dataGridView_MouseClick;dataGridView.MouseClick += dataGridView_MouseClick;}#endregion#region 事件处理#region 数据绑定完毕事件处理,设置奇偶背景色及当前行选中状态private static void dataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e){#region 0、条件验证DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}#endregion#region 设置奇偶行背景色for (int i = 0; i < dataGridView.Rows.Count; i++){if (i % 2 == 0){dataGridView.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(204, 255, 204);}else{dataGridView.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(255, 255, 204);}}#endregion#region 取消选中行if (dataGridView.CurrentRow != null){dataGridView.CurrentRow.Selected = false;}#endregion}#endregion#region 单元格点击事件处理,编辑状态时,把对应的编辑控件添加到对应的位置/// <summary>/// 单元格鼠标点击事件/// </summary>/// <param name="sender">事件源对象</param>/// <param name="e">事件对象</param>private static void dataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e){Console.WriteLine("dataGridView_CellMouseClick");#region 0、条件验证if (Common.Global.Instance.CurrEditorMode != Wongoing.Entity.Enum.TaskEditorMode.Edit){return;}DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}if (e.RowIndex < 0 || e.RowIndex >= dataGridView.RowCount){return;}if (e.ColumnIndex == 0){return;}#endregionConsole.WriteLine("dataGridView_CellMouseClick Controls = " + dataGridView.Controls.Count);#region 1、还原行高for (int i = 0; i < dataGridView.Rows.Count; i++){if (dataGridView.Rows[i].Height != dataGridView.RowTemplate.Height){dataGridView.Rows[i].Height = dataGridView.RowTemplate.Height;}}#endregion#region 2、添加编辑控件System.Drawing.Rectangle rect = dataGridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);#region 2.1 控制模式if (dataGridView.Columns[e.ColumnIndex].DataPropertyName == "ControlMode"){if (!dataGridView.Controls.ContainsKey(TaskEditorlHelper.Instance.ControlMode.MainEditItem.Name)){Control ctl = TaskEditorlHelper.CreateComponent(TaskEditorlHelper.Instance.ControlMode.MainEditItem);if (ctl != null){int x = rect.Left + 5;int y = rect.Top + (rect.Height - ctl.Height) / 2 - 1;ctl.Location = new System.Drawing.Point(x, y);if (ctl is ComboBox){ComboBox cbControlMode = ctl as ComboBox;cbControlMode.DataSource = DataSourceHelper.Instance.ControlModeData;cbControlMode.SelectedIndexChanged += cbControlMode_SelectedIndexChanged;}dataGridView.Controls.Add(ctl);}}                }#endregion#region 2.2 跳转条件#endregion#region 2.3 记录条件#endregion#region 2.4 电流量程#endregion#endregion#region 3、保存当前垂直滚动条和水平滚动条的位置LastVerticalScrollingOffset = dataGridView.VerticalScrollingOffset;             //保存当前垂直滚动条的位置LastHorizontalScrollingOffset = dataGridView.HorizontalScrollingOffset;         //保存当前水平滚动条的位置#endregion#region 4、设置选中行if (dataGridView.CurrentRow != null){dataGridView.CurrentRow.Selected = true;}#endregionConsole.WriteLine("dataGridView_CellMouseClick Controls = " + dataGridView.Controls.Count);}/// <summary>/// 选择控制模式事件处理/// </summary>/// <param name="sender">事件源</param>/// <param name="e">事件参数</param>private static void cbControlMode_SelectedIndexChanged(object sender, EventArgs e){Console.WriteLine("cbControlMode_SelectedIndexChanged...");int maxHeight = 0;ComboBox cbControlMode = sender as ComboBox;if (cbControlMode != null){if (cbControlMode.Parent != null && cbControlMode.Parent is DataGridView){Console.WriteLine("cbControlMode_SelectedIndexChanged Controls = " + cbControlMode.Parent.Controls.Count);DataGridView dataGridView = cbControlMode.Parent as DataGridView;if (dataGridView.CurrentRow != null){maxHeight = dataGridView.CurrentRow.Height;}if (cbControlMode.SelectedItem is DataItem){DataItem selectItem = cbControlMode.SelectedItem as DataItem;if (selectItem != null){Console.WriteLine(selectItem.DataPropertyName);#region 移除之前的选项控件foreach (string key in TaskEditorlHelper.Instance.ControlMode.DicOptionItems.Keys){foreach (EditControlItem item in TaskEditorlHelper.Instance.ControlMode.DicOptionItems[key]){cbControlMode.Parent.Controls.RemoveByKey(item.Name);}}#endregion#region 新增对应的选项控件if (TaskEditorlHelper.Instance.ControlMode.DicOptionItems.ContainsKey(selectItem.DataPropertyName)){List<EditControlItem> controlItems = TaskEditorlHelper.Instance.ControlMode.DicOptionItems[selectItem.DataPropertyName];int x = cbControlMode.Location.X + cbControlMode.Width;int y = cbControlMode.Location.Y;for (int i = 0; i < controlItems.Count; i++){Control c = TaskEditorlHelper.CreateComponent(controlItems[i]);if (c.Height > maxHeight){maxHeight = c.Height;}x += 5;c.Location = new System.Drawing.Point(x, y);cbControlMode.Parent.Controls.Add(c);x += c.Width;}#region 修改行高if (dataGridView.CurrentRow != null){if (maxHeight > dataGridView.CurrentRow.Height){dataGridView.CurrentRow.Height = maxHeight;}}#endregion#region 重新定位Label控件foreach (Control c in cbControlMode.Parent.Controls){if (c is Label){c.Top = c.Top - (dataGridView.RowTemplate.Height - cbControlMode.Height) / 2 + (maxHeight - c.Height) / 2;}}#endregion}else{Console.WriteLine(String.Format("The ControlMode DicOptionItems Keys not Conains the [{0}]", selectItem.DataPropertyName));}#endregion}}Console.WriteLine("cbControlMode_SelectedIndexChanged Controls = " + cbControlMode.Parent.Controls.Count);}}}#endregion#region 当前单元格离开事件,从编辑控件中获取数据并填充值单元格private static void dataGridView_CellLeave(object sender, DataGridViewCellEventArgs e){Console.WriteLine("dataGridView_CellLeave");#region 0、条件验证if (Common.Global.Instance.CurrEditorMode != Wongoing.Entity.Enum.TaskEditorMode.Edit){return;}DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}#endregion#region 控件取值StringBuilder sbValue = new StringBuilder();#region 2.1 控制模式if (dataGridView.Columns[e.ColumnIndex].DataPropertyName == "ControlMode"){if (dataGridView.Controls.ContainsKey(TaskEditorlHelper.Instance.ControlMode.MainEditItem.Name)){Control ctl = dataGridView.Controls.Find(TaskEditorlHelper.Instance.ControlMode.MainEditItem.Name, true).FirstOrDefault();if (ctl is ComboBox){ComboBox cbControlMode = ctl as ComboBox;if (cbControlMode.SelectedItem is Wongoing.Entity.DataItem){Wongoing.Entity.DataItem item = cbControlMode.SelectedItem as Wongoing.Entity.DataItem;sbValue.Append(item.DisplayName).Append(",").Append(item.DataPropertyName);if (TaskEditorlHelper.Instance.ControlMode.DicOptionItems.ContainsKey(item.DataPropertyName)){foreach (EditControlItem controlItem in TaskEditorlHelper.Instance.ControlMode.DicOptionItems[item.DataPropertyName]){ctl = dataGridView.Controls.Find(controlItem.Name, true).FirstOrDefault();if (ctl is TextBox || ctl is Label){PropertyInfo pi = ctl.GetType().GetProperty("Text");if (pi != null){sbValue.Append(",").Append(pi.GetValue(ctl, null));}}}}}}}}dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = sbValue.ToString();#endregion#region 跳转条件#endregion#region 记录条件#endregion#region 电流量程#endregion#endregion}#endregion#region 当前单元格更改事件处理,移除编辑控件private static void dataGridView_CurrentCellChanged(object sender, EventArgs e){Console.WriteLine("CurrentCellChanged");#region 0、条件验证if (Common.Global.Instance.CurrEditorMode != Wongoing.Entity.Enum.TaskEditorMode.Edit){return;}DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}#endregionConsole.WriteLine("dataGridView_CurrentCellChanged Controls = " + dataGridView.Controls.Count);#region 2、移除控件dataGridView.Controls.Clear();dataGridView.Controls.Clear();#endregion#region 3、取消选中行if (dataGridView.CurrentRow != null){dataGridView.CurrentRow.Selected = false;}#endregionConsole.WriteLine("dataGridView_CurrentCellChanged Controls = " + dataGridView.Controls.Count);}#endregion#region 滚动条滚动事件处理,对应的编辑控件要相应的位置移动private static void dataGridView_Scroll(object sender, ScrollEventArgs e){Console.WriteLine("Scroll..");#region 0、条件验证if (Common.Global.Instance.CurrEditorMode != Wongoing.Entity.Enum.TaskEditorMode.Edit){return;}DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}#endregionConsole.WriteLine("FirstDisplayedScrollingRowIndex = " + dataGridView.FirstDisplayedScrollingRowIndex + ", CurrRowIndex = " + dataGridView.CurrentCell.RowIndex);#region 1、控件根据滚动条的滚动值移动foreach (Control ctl in dataGridView.Controls){ctl.Left -= dataGridView.HorizontalScrollingOffset - LastHorizontalScrollingOffset;ctl.Top -= dataGridView.VerticalScrollingOffset - LastVerticalScrollingOffset;if (dataGridView.FirstDisplayedScrollingRowIndex > dataGridView.CurrentCell.RowIndex){ctl.Visible = false;}else{ctl.Visible = true;}}#endregion#region 2、保存当前垂直滚动条和水平滚动条的位置LastVerticalScrollingOffset = dataGridView.VerticalScrollingOffset;             //保存当前垂直滚动条的位置LastHorizontalScrollingOffset = dataGridView.HorizontalScrollingOffset;         //保存当前水平滚动条的位置#endregionConsole.WriteLine("HorizontalScrollingOffset = " + dataGridView.HorizontalScrollingOffset + ", VerticalScrollingOffset = " + dataGridView.VerticalScrollingOffset);}#endregion#region 右键点击列弹出上下文菜单private static void dataGridView_MouseClick(object sender, MouseEventArgs e){#region 0、条件验证if (Common.Global.Instance.CurrEditorMode != Wongoing.Entity.Enum.TaskEditorMode.Edit && e.Button == MouseButtons.Right){return;}if (e.Button != MouseButtons.Right){return;}DataGridView dataGridView = sender as DataGridView;if (dataGridView == null){return;}#endregion#region 1、构建上下文菜单ContextMenu contextMenu = new ContextMenu();MenuItem mnuAddTaskStep = new MenuItem();mnuAddTaskStep.Text = "追加工步";contextMenu.MenuItems.Add(mnuAddTaskStep);MenuItem mnuDelTaskStep = new MenuItem();mnuDelTaskStep.Text = "删除工步";contextMenu.MenuItems.Add(mnuDelTaskStep);contextMenu.Show(dataGridView, new System.Drawing.Point(e.X, e.Y));#endregion}#endregion#endregion}
}

窗体代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;namespace DXApplication1
{using Wongoing.Entity;using Helper2;using Wongoing.Basic;public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm{private List<TaskStep> _data = null;public XtraForm1(){InitializeComponent();this._data = this.GetTaskStepData();}private void XtraForm1_Load(object sender, EventArgs e){DataGridViewHelper.RegisterEvent(this.dataGridView1);DataGridViewHelper.SetStyle(this.dataGridView1);DataGridViewHelper.SetColumns(this.dataGridView1);this.dataGridView1.DataSource = this._data;}public List<TaskStep> GetTaskStepData(){List<TaskStep> lst = new List<TaskStep>();TaskStep ts = null;for (int i = 0; i < 20; i++){ts = new TaskStep();lst.Add(ts);}return lst;}private void button2_Click(object sender, EventArgs e){Wongoing.Entity.ControlModeEditor editor = new ControlModeEditor();Wongoing.Basic.SerializeHandler.SerializeXml<Wongoing.Entity.ControlModeEditor>(editor, @"e:\editor.xml");editor = Wongoing.Basic.SerializeHandler.DeserializeXml<Wongoing.Entity.ControlModeEditor>(@"e:\editor.xml");}}
}

完整代码下载

完整代码下载


http://chatgpt.dhexx.cn/article/xfOfuI8N.shtml

相关文章

C# datagridview 单行文字自动换行

dgv.DefaultCellStyle.WrapMode True dgv.RowTemplate.DefaultCellStyle.WrapMode True dgb.RowsDefaultCellStyle.WrapMode True dgv.AlternatingRowsDefaultCellStyle.WrapMode True 在设计界面里手动设置&#xff0c;一般情况下&#xff0c;设置其中一个WrapMode为true…

c#提高datagridview刷新速度(两种方法计时对比)

两种方法&#xff0c;代码如下&#xff1a; void initDataGridView(){Stopwatch sw new Stopwatch();//Stopwatch提供一组方法和属性&#xff0c;可用于准确地测量运行时间sw.Start();//方法一&#xff1a;一行一行增加到datagridview中for (int i 0; i < 10000; i){int R…

Winform中打印 dataGridView里的内容

最近评论问题比较多&#xff0c;这是几年前得代码了&#xff0c;今天正好有时间我重新整理了下代码把源码Demo发上来给大家看看互相学习。 有问题随时交流。没有积分得私信我发你。 Demo地址&#xff1a;DataGirdView打印.rar-C#文档类资源-CSDN下载 //调用GridPrinter首先添…

C# DataGridView 使用

1、//dataGridView標題居中 dataGridView2.ColumnHeadersDefaultCellStyle.Alignment DataGridViewContentAlignment.MiddleCenter;2、//dataGrideView文本居中 dataGridView2.RowsDefaultCellStyle.Alignment DataGridViewContentAlignment.MiddleCenter;3、//dataGridVie…

C#中DataGridView操作

DataGridView官方介绍 1.DataGridView增加数据 // 先清理&#xff0c;防止数据脏乱 skinDataGridView1.Rows.Clear(); // 获取最新行的索引 int index skinDataGridView1.Rows.Add(); // 添加数据 skinDataGridView1.Rows[index].Cells[0].Value "第index行第一列&quo…

C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法

C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法 DataGirdView控件Column类型DataGridViewButtonColumn列&#xff1a;按钮DataGridViewCheckBoxColumn列&#xff1a;复选框DataGridViewComboBoxColumn列&#xff1a;下拉框DataGridViewImageColumn…

DataGridView简单介绍

在很多软件中都需要查询数据&#xff0c;显示数据&#xff0c;机房收费系统也是非常多的。在这里我们就用到了DataGridView控件。 一&#xff0c;概述&#xff1a; 使用 DataGridView控件&#xff0c;可以显示和编辑来自多种不同类型的数据源的表格数据。它可以通过设置属性直接…

C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作

C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作 DataGridView表格样式设置DataGridView行序号设置 右键弹出控件表格操作DataGridView新建行DataGridView删除行DataGridView清除内容DataGridView复制DataGridView粘贴 在展示和处理二维数据时&…

C# DataGridView控件的基础应用实例

目录 引言一、界面简介二、初始化三、添加一行数据四、允许修改表格五、复制选择的数据六、复制所有数据七、读一行数据八、读所有数据九、查找名字记录十、删除一行数据十一、删除多行数据十二、清除所有行十三、删除所有列十四、其它&#xff1a;选中单元格十五、最后 引言 …

基于用户的协同过滤个性化音乐推荐系统毕业设计

基于用户的协同过滤个性化音乐推荐系统 摘 要 互联网发展到如今已经完完全全的改变了的生活方式&#xff0c;融入了日常生活&#xff0c;包括交流&#xff0c;出行&#xff0c;消费&#xff0c;娱乐等。与此同时&#xff0c;音乐数据也在与日俱增的变化着。用户在访问一个…

基于深度学习的音乐推荐系统

♚ 作者&#xff1a;沂水寒城&#xff0c;CSDN博客专家&#xff0c;个人研究方向&#xff1a;机器学习、深度学习、NLP、CV Blog: http://yishuihancheng.blog.csdn.net 推荐系统在我们日常生活中发挥着非常重要的作用&#xff0c;相信实际从事过推荐相关的工程项目的人或多或少…

(附源码)计算机毕业设计SSM基于java的音乐推荐系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于java的音乐推荐系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

【计算机毕业设计】Java基于协同过滤算法的音乐推荐系统

毕设帮助、开题指导、源码交流&#xff0c;联系方式见文末。。 音乐检索系统的开发目的是使音乐检索模式转变成信息管理&#xff0c;为音乐检索人员提供方便条件。对音乐检索的实际情况进行调研之后&#xff0c;进行详细的需求分析&#xff0c;对现有的管理模式进行改进&#x…

java基于springboot+vue协同过滤算法的音乐推荐系统

音乐是人类永恒的话题&#xff0c;无论是在古代还是现代人们对音乐都有一种非常的热爱在里面&#xff0c;同时音乐也寄语了人们对美好事物的憧憬&#xff0c;很多时候人们在试听音乐的时候并不能够及时的找到适合自己的音乐&#xff0c;而且当下很多音乐都是收费的&#xff0c;…

[附源码]java毕业设计网易云音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于python的音乐推荐系统

基于python的音乐推荐系统 算法:基于用户的协同过滤推荐算法 语言:python 数据库:sqlite 框架:django 编号:8448648225698568爱喝可乐的大学生

SpringBoot+Vue项目个性化音乐推荐系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springbootvue Node&#xff1a;node.js JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/idea,Visual Maven包…

如何使用Python实现音乐推荐系统

如何使用Python实现音乐推荐系统 在我的大学三年中&#xff0c;我最大的技术难题之一是如何使用Python实现音乐推荐系统。音乐推荐系统是基于用户听歌历史、用户喜好和音乐特征等因素&#xff0c;为用户推荐最合适的音乐。在这篇博客中&#xff0c;我将分享我是如何使用Python…

动手写简单的音乐推荐系统

简单音乐推荐系统的设计与实现 本文提供两种简单的传统音乐推荐系统&#xff08;next-songs 方向&#xff09;的思路与实现。&#xff08;数学原理和机器学习方法从略&#xff09; 下文仅给出思路以及关键代码&#xff0c;完整代码实现见: https://github.com/cdfmlr/murecom…