dgv_senceConfig_sence是DataGridView控件的名称;

这是整段代码的逻辑比较多,需要用户自己去选择,这个可以实现添加数据和拖动整行(肯定实现了)


using ControlFor.Common;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace ControlFor.Media
{public partial class AddEditRemoteControlForm : Form{/// <summary>/// main窗体/// </summary>private Main m_mainForm;/// <summary>/// main窗体传递过来的参数/// </summary>public string[] m_paramArr;/// <summary>/// 设备uuid(唯一识别号)/// </summary>public string m_uuid;/// <summary>/// 标志位,确定是新建还是修改(2表示新增)/// </summary>public string m_flag;/// <summary>/// 房间列表的字典/// </summary>public Dictionary<string, string> m_dic_room = new Dictionary<string, string>();/// <summary>/// 选中的房间id列表/// </summary>public List<string> m_list_room_id = new List<string>();/// <summary>/// 关联锁/// </summary>bool m_needSetRelateCheck = true;/// <summary>/// 选中的房间节点/// </summary>public List<TreeNode> m_list_room_node = new List<TreeNode>();/// <summary>/// 楼层列表/// </summary>public Dictionary<string, string> m_dic_floor = new Dictionary<string, string>();public Dictionary<string, List<Dictionary<string, string>>> m_dic_list_room = new Dictionary<string, List<Dictionary<string, string>>>();/// <summary>/// 保存情景模式的dynamic数据/// </summary>public List<dynamic> m_sence_list_dy = new List<dynamic>();#region 为了情景模式拖动设置的参数// 数据表/// <summary>/// 情景模式中的数据表/// </summary>DataTable m_dataTable = new DataTable();// 拖动的源数据行索引/// <summary>/// 拖动的源数据行索引/// </summary>private int m_indexOfItemUnderMouseToDrag = -1;// 拖动的目标数据行索引/// <summary>/// 拖动的目标数据行索引/// </summary>private int m_indexOfItemUnderMouseToDrop = -1;// 拖动中的鼠标所在位置的当前行索引/// <summary>/// 拖动中的鼠标所在位置的当前行索引/// </summary>private int m_indexOfItemUnderMouseOver = -1;// 不启用拖放的鼠标范围/// <summary>/// 不启用拖放的鼠标范围/// </summary>private Rectangle m_dragBoxFromMouseDown = Rectangle.Empty;#endregionpublic AddEditRemoteControlForm(){InitializeComponent();}/// <summary>/// 新增/编辑遥控器窗体/// </summary>/// <param name="postParam"></param>/// <param name="main"></param>public AddEditRemoteControlForm(string[] postParam, Main main){m_mainForm = main;m_paramArr = postParam;m_flag = postParam[0];InitializeComponent();CommonClass.SetFormIcon<AddEditRemoteControlForm>(this);if (m_flag == "2")  // 新增{pnl_attribute_modify.Visible = false;m_uuid = System.Text.RegularExpressions.Regex.Replace(Guid.NewGuid().ToString(), "[-]", "");getRoomListFunc(m_uuid);txt_name.Text = "遥控器"+ m_paramArr[2].ToString();txt_type.Text = postParam[1];string my_room_name = "";if (m_dic_room.TryGetValue(postParam[5], out my_room_name)){txt_room.Text = my_room_name;}else{MessageBox.Show("设置设备所属房间错误");}}else //编辑{try{pnl_attribute_modify.Visible = true;//获取设备uuidm_uuid = m_paramArr[3];#region 获取遥控器关联房间列表//Dictionary<string, object> my_romm_param = new Dictionary<string, object>();//my_romm_param.Add("remote_control_id", m_uuid);//my_romm_param.Add("project_id", InfoClass.projectId);//string my_str_gstr_room = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRcRoomList", my_param);//dynamic my_data_room = JsonConvert.DeserializeObject<dynamic>(my_str_gstr_room);getRoomListFunc(m_uuid);#endregionDictionary<string, object> my_param = new Dictionary<string, object>();my_param.Add("remote_control_id", m_uuid);my_param.Add("project_id", InfoClass.projectId);string my_str_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRemoteControlInfo", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_str_gstr);txt_name.Text = my_data.re.remote_control_name != null ? my_data.re.remote_control_name.ToString() : "";txt_type.Text = my_data.re.type != null ? my_data.re.type.ToString() : "";txt_mac.Text = my_data.re.hardware_id != null ? my_data.re.hardware_id.ToString() : "";txt_ip.Text = my_data.re.remote_control_ip != null ? my_data.re.remote_control_ip.ToString() : "";txt_floor_info.Text = my_data.re.hardware_version != null ? my_data.re.hardware_version.ToString() : "";txt_software_verInfo.Text = my_data.re.software_version != null ? my_data.re.software_version.ToString() : "";string my_room_name = "";if (m_dic_room.TryGetValue(my_data.re.room_id.ToString(), out my_room_name)){txt_room.Text = my_room_name;}else{MessageBox.Show("设置设备所属房间错误");}}catch (Exception ex){LogHelper.WriteLog(ex, "遥控器初始化数据异常");}}}/// <summary>/// 获取房间列表/// </summary>public void getRoomListFunc(string my_uuid){try{m_list_room_node.Clear();Dictionary<string, object> my_param = new Dictionary<string, object>();my_param.Add("remote_control_id", my_uuid);my_param.Add("project_id", InfoClass.projectId);string my_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRcRoomList", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_gstr);initRoomTreeViewFunc(my_data);}catch (Exception ex){LogHelper.WriteLog(ex, "获取房间列表发生异常");}}/// <summary>/// 初始化房间树/// </summary>/// <param name="my_param_data"></param>public void initRoomTreeViewFunc(dynamic my_data) {if (my_data != null && my_data.code > 0){#region 添加根节点trv_room.Nodes.Clear();var topNode = new TreeNode();topNode.Name = "1";topNode.Text = "楼层列表";topNode.Tag = "floor_list"; //类型this.trv_room.Nodes.Add(topNode);#endregion#region 加载子节点节点List<dynamic> my_list_dy_floor = JsonConvert.DeserializeObject<List<dynamic>>(my_data.re.ToString());for (int i = 0; i < my_list_dy_floor.Count; i++){dynamic my_info = my_list_dy_floor[i]; //楼层TreeNode my_floor_node = new TreeNode();my_floor_node.Text = my_info.floor_name; //节点名称my_floor_node.Tag = my_info.sys_level_type;  //节点类型topNode.Nodes.Add(my_floor_node);List<dynamic> my_list_dy_room = JsonConvert.DeserializeObject<List<dynamic>>(my_info.roomList.ToString());for (int j = 0; j < my_list_dy_room.Count; j++) {dynamic my_room_info = my_list_dy_room[j]; //房间TreeNode my_room_node = new TreeNode();my_room_node.Name = my_room_info.room_id;my_room_node.Text = my_room_info.room_name;m_dic_room.Add(my_room_info.room_id.ToString(), my_room_info.room_name.ToString());my_room_node.Tag = "room";if (my_room_info.isSelected.ToString() == "1"){my_room_node.Checked = true;if (m_flag == "1"){m_list_room_node.Add(my_room_node);}}my_floor_node.Nodes.Add(my_room_node);trv_room.Nodes[0].Expand();//my_floor_node.Expand();}}#endregion  for (int i = 0; i < m_list_room_node.Count; i++){checkNodeFunc(m_list_room_node[i]);}}else{MessageBox.Show("初始化房间数据失败");return;}}private void btn_submit_Click(object sender, EventArgs e){try{//首先获取那些节点被选中getCheckNodeListFunc();Console.WriteLine(m_list_room_id.Count.ToString());Dictionary<string, object> my_param = new Dictionary<string, object>();List<Dictionary<string, string>> keyValuePairs = new List<Dictionary<string, string>>();for (int i = 0; i < m_list_room_id.Count; i++){Dictionary<string, string> keyValuePairs1 = new Dictionary<string, string>();keyValuePairs1.Add("room_id", m_list_room_id[i]);keyValuePairs.Add(keyValuePairs1);}my_param.Add("roomRemoteControls", keyValuePairs);my_param.Add("remote_control_id", m_uuid);my_param.Add("remote_control_name", this.txt_name.Text.Trim());my_param.Add("project_id", InfoClass.projectId);my_param.Add("room_id", m_paramArr[5]);my_param.Add("hardware_id", txt_mac.Text.Trim());my_param.Add("create_person_id", InfoClass.userId);string my_str_gstr;dynamic my_data;if (m_flag == "2") //新建{my_param.Add("type", this.txt_type.Text.Trim());my_str_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/addRemoteControl", my_param);}else{my_str_gstr = my_str_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/editRemoteControl", my_param); ;}my_data = JsonConvert.DeserializeObject<dynamic>(my_str_gstr);if (my_data.code > 0){MessageBox.Show("成功");m_mainForm.GetSysTree();this.Close();this.Dispose();}else{MessageBox.Show("参数或网络问题,保存失败");}}catch (Exception ex){LogHelper.WriteLog(ex, "保存数据发生异常");}}/// <summary>/// 获取选中节点/// </summary>public void getCheckNodeListFunc() {m_list_room_id.Clear();foreach (TreeNode item in trv_room.Nodes) {getDiGuiFunc(item);}}/// <summary>/// 递归查找,将节点添加到要提交的数据列表/// </summary>/// <param name="tn"></param>/// <param name="my_function_id"></param>/// <returns></returns>public void getDiGuiFunc(TreeNode tn) {foreach (TreeNode tnSub in tn.Nodes){if (tnSub.Checked && tnSub.Tag.ToString() == "room"){m_list_room_id.Add(tnSub.Name.ToString());}getDiGuiFunc(tnSub);}}private void trv_room_AfterCheck(object sender, TreeViewEventArgs e){try{if (!m_needSetRelateCheck){return;}//1、判断当前操作节点勾还是不勾//如果勾,当前节点下所有子节点都要勾上//如果不勾,下面子节点全部不勾TreeNode node = e.Node;if (node.Checked){node.Nodes.OfType<TreeNode>().ToList().ForEach(x => x.Checked = true);}else{node.Nodes.OfType<TreeNode>().ToList().ForEach(x => x.Checked = false);}//2、如果当前节点被勾选,如果当前节点被勾选,则其上溯所有祖先节点都要勾//否则判断当前节点所有兄弟节点是否有勾,有则父节点要勾,没有则父节点不勾m_needSetRelateCheck = false; //为本方法上锁,确保连带影响不会运行本事件中代码if (node.Checked){while (node.Parent != null){node = node.Parent;node.Checked = true;}}else{while (node.Parent != null){node = node.Parent;bool hasCheckedChild = false;foreach (TreeNode child in node.Nodes){if (child.GetHashCode() == e.Node.GetHashCode()){continue;}if (child.Checked){hasCheckedChild = true;break;}}if (!hasCheckedChild){node.Checked = false;}else{break;}}}m_needSetRelateCheck = true; //为本方法解锁}catch (Exception ex){LogHelper.WriteLog(ex, "遥控器-》trv_room_AfterSelect发生异常");}}/// <summary>/// 初始化房间选中/// </summary>/// <param name="node"></param>public void checkNodeFunc(TreeNode node) {try{if (!m_needSetRelateCheck){return;}//1、判断当前操作节点勾还是不勾//如果勾,当前节点下所有子节点都要勾上//如果不勾,下面子节点全部不勾if (node.Checked){node.Nodes.OfType<TreeNode>().ToList().ForEach(x => x.Checked = true);}else{node.Nodes.OfType<TreeNode>().ToList().ForEach(x => x.Checked = false);}//2、如果当前节点被勾选,如果当前节点被勾选,则其上溯所有祖先节点都要勾//否则判断当前节点所有兄弟节点是否有勾,有则父节点要勾,没有则父节点不勾m_needSetRelateCheck = false; //为本方法上锁,确保连带影响不会运行本事件中代码if (node.Checked){while (node.Parent != null){node = node.Parent;node.Checked = true;}}else{while (node.Parent != null){node = node.Parent;bool hasCheckedChild = false;foreach (TreeNode child in node.Nodes){if (child.GetHashCode() == node.GetHashCode()){continue;}if (child.Checked){hasCheckedChild = true;break;}}if (!hasCheckedChild){node.Checked = false;}else{break;}}}m_needSetRelateCheck = true; //为本方法解锁}catch (Exception ex){LogHelper.WriteLog(ex, "遥控器-》trv_room_AfterSelect发生异常");}}private void tab_all_SelectedIndexChanged(object sender, EventArgs e){switch (tab_all.SelectedTab.Text){case "属性":Console.WriteLine("属性");break;case "按键配置":Console.WriteLine("按键配置");getRemoteControlBtnKeyList(m_uuid);break;case "情景配置":Console.WriteLine("情景配置");getSenceConfigRoomListFunc(m_uuid);break;default:break;  }}#region 遥控器按键属性配置界面方法/// <summary>/// 获取遥控器按键属性/// </summary>/// <param name="my_uuid">遥控器id</param>public void getRemoteControlBtnKeyList(string my_uuid) {try{Dictionary<string, object> my_param = new Dictionary<string, object>();my_param.Add("remote_control_id", my_uuid);my_param.Add("project_id", InfoClass.projectId);string my_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRemoteControlBtn", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_gstr);if (my_data.code > 0 && my_data.re != null){List<dynamic> my_mlist = JsonConvert.DeserializeObject<List<dynamic>>(my_data.re.ToString());if (my_mlist != null && my_mlist.Count > 0) {DataTable dt = new DataTable();dt.Columns.Add("remote_control_sub_name");dt.Columns.Add("button_id");dt.Columns.Add("remote_control_sub_id");dt.Columns.Add("IsEdit");Console.WriteLine("keyvalue->"+my_mlist.Count.ToString());foreach (var item in my_mlist){DataRow dr = dt.NewRow();dr[0] = item.remote_control_sub_name == null ? "" : item.remote_control_sub_name.ToString();dr[1] = item.button_id == null ? "" : item.button_id.ToString();dr[2] = item.remote_control_sub_id == null ? "" : item.remote_control_sub_id.ToString();dr[3] = "0"; // 是否编辑(初始化都是不编辑)dt.Rows.Add(dr);}//Parallel.For(0, my_mlist.Count, i => //{//    var item = my_mlist[i];//    DataRow dr = dt.NewRow();//    dr[0] = item.button_id == null ? "" : item.button_id.ToString();//    dr[1] = item.remote_control_sub_name == null ? "" : item.remote_control_sub_name.ToString();//    dr[2] = item.remote_control_sub_id == null ? "" : item.remote_control_sub_id.ToString();//    dr[3] = "0"; // 是否编辑(初始化都是不编辑)//    dt.Rows.Add(dr);//} );dgv_keyValue.DataSource = null;dgv_keyValue.DataSource = dt;dgv_keyValue.Columns[2].Visible = false;dgv_keyValue.Columns[3].Visible = false;}}}catch (Exception ex){LogHelper.WriteLog(ex, "初始化按键配置列表异常");}}private void dgv_keyValue_CellClick(object sender, DataGridViewCellEventArgs e){try{if (e.RowIndex > -1){// DGVLight[13, e.RowIndex].Value = "1";//认定被修改过dgv_keyValue[3, e.RowIndex].Value = "1"; // 认定此行数据被修改}}catch (Exception ex){LogHelper.WriteLog(ex, "AddEditRemoteControlForm->dgv_keyValue_CellClick");}}/// <summary>/// 提交数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_keyConfig_submit_Click(object sender, EventArgs e){try{Dictionary<string, object> my_param = new Dictionary<string, object>();List<Dictionary<string, string>> keyValuePairs = new List<Dictionary<string, string>>();// string my_str = dgv_keyValue.Rows[0].Cells[0].Value.ToString();if (dgv_keyValue.Rows.Count > 0 && dgv_keyValue.Rows[0].Cells[0].Value != null && dgv_keyValue.Rows[0].Cells[0].Value.ToString() != "") {foreach (DataGridViewRow r in dgv_keyValue.Rows) {if (r.Cells[0].Value != null && r.Cells[0].Value.ToString() != "" && r.Cells[1].Value != null && r.Cells[1].Value.ToString() != "" && r.Cells[3].Value != null && r.Cells[3].Value.ToString() == "1") {Dictionary<string, string> keyValuePairs1 = new Dictionary<string, string>();keyValuePairs1.Add("remote_control_sub_name", r.Cells[0].Value.ToString());keyValuePairs1.Add("remote_control_sub_id", r.Cells[2].Value.ToString());keyValuePairs1.Add("button_id", r.Cells[1].Value.ToString());keyValuePairs.Add(keyValuePairs1);}}if (keyValuePairs.Count <= 0){return;}my_param.Add("subList", keyValuePairs);my_param.Add("remote_control_id", m_uuid);my_param.Add("create_person_id", InfoClass.userId);my_param.Add("project_id", InfoClass.projectId);string my_str_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/editRemoteControlBtn", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_str_gstr);if (my_data.code > 0) {MessageBox.Show("保存成功");}else{MessageBox.Show("参数或网络问题,保存失败");}getRemoteControlBtnKeyList(m_uuid);}}catch (Exception ex){LogHelper.WriteLog(ex, "AddEditRemoteControlForm->btn_keyConfig_submit_Click");}}#endregion#region 遥控器情景配置界面/// <summary>/// 情景配置中获取树中的数据/// </summary>/// <param name="my_uuid"></param>public void getSenceConfigRoomListFunc(string my_uuid) {try{m_dic_floor.Clear();m_dic_list_room.Clear();Dictionary<string, object> my_param = new Dictionary<string, object>();my_param.Add("remote_control_id", my_uuid);my_param.Add("project_id", InfoClass.projectId);string my_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRcRoomList", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_gstr);if (my_data != null && my_data.code > 0){#region 加载子节点List<dynamic> my_list_dy_floor = JsonConvert.DeserializeObject<List<dynamic>>(my_data.re.ToString());for (int i = 0; i < my_list_dy_floor.Count; i++){dynamic my_info = my_list_dy_floor[i]; //楼层TreeNode my_floor_node = new TreeNode();my_floor_node.Text = my_info.floor_name; //节点名称my_floor_node.Tag = my_info.sys_level_type;  //节点类型m_dic_floor.Add(my_info.floor_id.ToString(), my_info.floor_name.ToString());List<Dictionary<string, string>> my_list_room = new List<Dictionary<string, string>>();List<dynamic> my_list_dy_room = JsonConvert.DeserializeObject<List<dynamic>>(my_info.roomList.ToString());for (int j = 0; j < my_list_dy_room.Count; j++) {dynamic my_room_info = my_list_dy_room[j]; //房间TreeNode my_room_node = new TreeNode();my_room_node.Name = my_room_info.room_id;my_room_node.Text = my_room_info.room_name;my_room_node.Tag = "room";my_floor_node.Nodes.Add(my_room_node);Dictionary<string, string> my_dic_room = new Dictionary<string, string>();my_dic_room.Add(my_room_info.room_id.ToString(), my_room_info.room_name.ToString());my_list_room.Add(my_dic_room);}m_dic_list_room.Add(my_info.floor_id.ToString(), my_list_room);}#endregion#region 初始化楼层下拉框DataTable my_floor_dt = new DataTable();DataColumn dc1 = new DataColumn("id");DataColumn dc2 = new DataColumn("name");my_floor_dt.Columns.Add(dc1);my_floor_dt.Columns.Add(dc2);foreach (KeyValuePair<string,string> kvp in m_dic_floor){DataRow dr1 = my_floor_dt.NewRow();dr1["id"] = kvp.Key;dr1["name"] = kvp.Value;my_floor_dt.Rows.Add(dr1);}cmb_senceConfig_floor.DataSource = my_floor_dt;cmb_senceConfig_floor.ValueMember = "id";cmb_senceConfig_floor.DisplayMember = "name";#endregion#region 初始化房间下拉框DataTable my_room_dt = new DataTable();DataColumn my_room_dc1 = new DataColumn("id");DataColumn my_room_dc2 = new DataColumn("name");my_room_dt.Columns.Add(my_room_dc1);my_room_dt.Columns.Add(my_room_dc2);string my_str_floor = cmb_senceConfig_floor.SelectedValue.ToString(); List<Dictionary<string, string>> my_list_dic_room = m_dic_list_room[my_str_floor];for (int i = 0; i < my_list_dic_room.Count; i++){Dictionary<string, string> my_dic_room = my_list_dic_room[i];foreach (KeyValuePair<string, string> kvp in my_dic_room){DataRow dr1 = my_room_dt.NewRow();dr1["id"] = kvp.Key;dr1["name"] = kvp.Value;my_room_dt.Rows.Add(dr1);}}cmb_senceConfig_room.DataSource = my_room_dt;cmb_senceConfig_room.ValueMember = "id";cmb_senceConfig_room.DisplayMember = "name";#endregion}else{MessageBox.Show("初始化房间数据失败");return;}}catch (Exception ex){LogHelper.WriteLog(ex, "AddEditRemoteControlForm->getSenceConfigRoomListFunc");}}#endregion/// <summary>/// 楼层发生变化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmb_senceConfig_floor_SelectedIndexChanged(object sender, EventArgs e){#region 初始化房间下拉框DataTable my_room_dt = new DataTable();DataColumn my_room_dc1 = new DataColumn("id");DataColumn my_room_dc2 = new DataColumn("name");my_room_dt.Columns.Add(my_room_dc1);my_room_dt.Columns.Add(my_room_dc2);string my_str_floor = cmb_senceConfig_floor.SelectedValue.ToString();if (my_str_floor == "System.Data.DataRowView"){return;}List<Dictionary<string, string>> my_list_dic_room = m_dic_list_room[my_str_floor];for (int i = 0; i < my_list_dic_room.Count; i++){Dictionary<string, string> my_dic_room = my_list_dic_room[i];foreach (KeyValuePair<string, string> kvp in my_dic_room){DataRow dr1 = my_room_dt.NewRow();dr1["id"] = kvp.Key;dr1["name"] = kvp.Value;my_room_dt.Rows.Add(dr1);}}cmb_senceConfig_room.DataSource = my_room_dt;cmb_senceConfig_room.ValueMember = "id";cmb_senceConfig_room.DisplayMember = "name";#endregion}/// <summary>/// 房间发生变化/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmb_senceConfig_room_SelectedIndexChanged(object sender, EventArgs e){try{Console.WriteLine("房间发生变化");string my_str_room = cmb_senceConfig_room.SelectedValue.ToString();if (my_str_room == "System.Data.DataRowView"){return;}Dictionary<string, object> my_param = new Dictionary<string, object>();my_param.Add("remote_control_id", m_uuid);my_param.Add("room_id", my_str_room);my_param.Add("project_id", InfoClass.projectId);string my_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/getRcSceneList", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_gstr);if (my_data != null && my_data.code > 0){List<dynamic> my_mlist = JsonConvert.DeserializeObject<List<dynamic>>(my_data.re.ToString());m_sence_list_dy = my_mlist;if (my_mlist != null && my_mlist.Count > 0){DataTable dt = new DataTable();dt.Columns.Add("scene_name");dt.Columns.Add("scene_id");dt.Columns.Add("IsEdit");foreach (var item in my_mlist){DataRow dr = dt.NewRow();dr[0] = item.scene_name == null ? "" : item.scene_name.ToString();dr[1] = item.scene_id == null ? "" : item.scene_id.ToString();dr[2] = "0"; // 是否编辑(初始化都是不编辑)dt.Rows.Add(dr);}dgv_senceConfig_sence.DataSource = null;m_dataTable = dt;dgv_senceConfig_sence.DataSource = m_dataTable;dgv_senceConfig_sence.Columns[0].FillWeight = 200;dgv_senceConfig_sence.Columns[1].Visible = false;dgv_senceConfig_sence.Columns[3].Visible = false;dgv_senceConfig_sence.Columns[2].HeaderText = "名称";dgv_senceConfig_sence.Columns[2].FillWeight = 1000;dgv_senceConfig_sence.Columns[4].Visible = false;for (int i = 0; i < my_mlist.Count; i++){dynamic my_temp_dy = my_mlist[i];for (int j = 0; j < dgv_senceConfig_sence.Rows.Count; j++){string my_uuid = dgv_senceConfig_sence.Rows[j].Cells[3].Value.ToString();if (my_temp_dy.scene_id.ToString() == my_uuid){if (my_temp_dy.isSelected.ToString() == "1"){((DataGridViewCheckBoxCell)dgv_senceConfig_sence.Rows[j].Cells["IsCheck"]).Value = true;}}}}}}else{dgv_senceConfig_sence.DataSource = null;if (dgv_senceConfig_sence.Columns.Count < 5){if (dgv_senceConfig_sence.Columns[0] != null){dgv_senceConfig_sence.Columns[0].HeaderText = "是否选中";dgv_senceConfig_sence.Columns[0].FillWeight = 200;}if (dgv_senceConfig_sence.Columns[1] != null){dgv_senceConfig_sence.Columns[1].HeaderText = "名称";dgv_senceConfig_sence.Columns[1].FillWeight = 1000;dgv_senceConfig_sence.Columns[1].Visible = true;}}else{if (dgv_senceConfig_sence.Columns[0] != null){dgv_senceConfig_sence.Columns[0].HeaderText = "是否选中";dgv_senceConfig_sence.Columns[0].FillWeight = 200;}if (dgv_senceConfig_sence.Columns[1] != null){dgv_senceConfig_sence.Columns[1].Visible = false;}if (dgv_senceConfig_sence.Columns[2] != null){dgv_senceConfig_sence.Columns[2].HeaderText = "名称";dgv_senceConfig_sence.Columns[2].FillWeight = 1000;}if (dgv_senceConfig_sence.Columns[3] != null){dgv_senceConfig_sence.Columns[3].Visible = false;}if (dgv_senceConfig_sence.Columns[4] != null){dgv_senceConfig_sence.Columns[4].Visible = false;}}}}catch (Exception ex){LogHelper.WriteLog(ex, "AddEditRemoteControlForm->cmb_senceConfig_room_SelectedIndexChanged");}}private void btn_sceneConfig_submit_Click(object sender, EventArgs e){try{Dictionary<string, object> my_param = new Dictionary<string, object>();List<Dictionary<string, string>> keyValuePairs = new List<Dictionary<string, string>>();int my_count = 0;for (int i = 0; i < dgv_senceConfig_sence.Rows.Count; i++){DataGridViewRow r = dgv_senceConfig_sence.Rows[i];string my_isCheck = r.Cells[0].Value != null ? r.Cells[0].Value.ToString() : "false";if (my_isCheck == "True"){Dictionary<string, string> keyValuePairs1 = new Dictionary<string, string>();keyValuePairs1.Add("scene_id", r.Cells[3].Value.ToString());keyValuePairs1.Add("project_id", InfoClass.projectId);keyValuePairs1.Add("r_c_scene_order", my_count.ToString());keyValuePairs1.Add("create_person_id", InfoClass.userId);keyValuePairs.Add(keyValuePairs1);my_count++;}}//foreach (DataGridViewRow r in dgv_senceConfig_sence.Rows)//{//    string my_isCheck = r.Cells[0].Value != null ? r.Cells[0].Value.ToString() : "false";//    if (my_isCheck == "true")//    {//        Dictionary<string, string> keyValuePairs1 = new Dictionary<string, string>();//        keyValuePairs1.Add("scene_id", r.Cells[0].Value.ToString());//        keyValuePairs1.Add("project_id", InfoClass.projectId);//        keyValuePairs1.Add("r_c_scene_order", r.Cells[1].Value.ToString());//        keyValuePairs.Add(keyValuePairs1);//    }//}if (keyValuePairs.Count <= 0){MessageBox.Show("请选择需要提交的数据");return;}my_param.Add("remoteControlScenes", keyValuePairs);my_param.Add("remote_control_id", m_uuid);my_param.Add("room_id", cmb_senceConfig_room.SelectedValue.ToString());string my_str_gstr = CommonClass.http.NewPostNew(InfoClass.api + @"/ToolRest/editRcScene", my_param);dynamic my_data = JsonConvert.DeserializeObject<dynamic>(my_str_gstr);if (my_data.code > 0){MessageBox.Show("保存成功");cmb_senceConfig_room_SelectedIndexChanged(null,null);}else{MessageBox.Show("参数或网络问题,保存失败");}}catch (Exception ex){LogHelper.WriteLog(ex, "AddEditRemoteControlForm->btn_sceneConfig_submit_Click");}}private void dgv_senceConfig_sence_MouseDown(object sender, MouseEventArgs e){// 通过鼠标按下的位置获取所在行的信息var hitTest = dgv_senceConfig_sence.HitTest(e.X, e.Y);if (hitTest.Type != DataGridViewHitTestType.Cell)return;// 记下拖动源数据行的索引及已鼠标按下坐标为中心的不会开始拖动的范围m_indexOfItemUnderMouseToDrag = hitTest.RowIndex;if (m_indexOfItemUnderMouseToDrag > -1){Size dragSize = SystemInformation.DragSize;m_dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);}elsem_dragBoxFromMouseDown = Rectangle.Empty;}private void dgv_senceConfig_sence_MouseUp(object sender, MouseEventArgs e){// 释放鼠标按键时清空变量为默认值m_dragBoxFromMouseDown = Rectangle.Empty;}private void dgv_senceConfig_sence_MouseMove(object sender, MouseEventArgs e){// 不是鼠标左键按下时移动if ((e.Button & MouseButtons.Left) != MouseButtons.Left)return;// 如果鼠标在不启用拖动的范围内if (m_dragBoxFromMouseDown == Rectangle.Empty || m_dragBoxFromMouseDown.Contains(e.X, e.Y))return;// 如果源数据行索引值不正确if (m_indexOfItemUnderMouseToDrag < 0)return;// 开始拖动,第一个参数表示要拖动的数据,可以自定义,一般是源数据行var row = dgv_senceConfig_sence.Rows[m_indexOfItemUnderMouseToDrag];DragDropEffects dropEffect = dgv_senceConfig_sence.DoDragDrop(row, DragDropEffects.All);//拖动过程结束后清除拖动位置行的红线效果OnRowDragOver(-1);}private void OnRowDragOver(int rowIndex){// 如果和上次导致重绘的行是同一行则无需重绘if (m_indexOfItemUnderMouseOver == rowIndex)return;int old = m_indexOfItemUnderMouseOver;m_indexOfItemUnderMouseOver = rowIndex;// 去掉原有行的红线if (old > -1)dgv_senceConfig_sence.InvalidateRow(old);// 绘制新行的红线if (rowIndex > -1)dgv_senceConfig_sence.InvalidateRow(rowIndex);}private void dgv_senceConfig_sence_DragOver(object sender, DragEventArgs e){// 把屏幕坐标转换成控件坐标Point p = dgv_senceConfig_sence.PointToClient(new Point(e.X, e.Y));// 通过鼠标按下的位置获取所在行的信息// 如果不是在数据行或者在源数据行上则不能作为拖放的目标var hitTest = dgv_senceConfig_sence.HitTest(p.X, p.Y);if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == m_indexOfItemUnderMouseToDrag){e.Effect = DragDropEffects.None;OnRowDragOver(-1);return;}// 设置为作为拖放移动的目标e.Effect = DragDropEffects.Move;// 通知目标行重绘OnRowDragOver(hitTest.RowIndex);}private void dgv_senceConfig_sence_DragDrop(object sender, DragEventArgs e){// 把屏幕坐标转换成控件坐标Point p = dgv_senceConfig_sence.PointToClient(new Point(e.X, e.Y));// 如果当前位置不是数据行// 或者刚好是源数据行的下一行(本示例中假定拖放操作为拖放至目标行的上方)// 则不进行任何操作var hitTest = dgv_senceConfig_sence.HitTest(p.X, p.Y);if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == m_indexOfItemUnderMouseToDrag + 1)return;m_indexOfItemUnderMouseToDrop = hitTest.RowIndex;// * 执行拖放操作(执行的逻辑按实际需要)var tempRow = m_dataTable.NewRow();tempRow.ItemArray = m_dataTable.Rows[m_indexOfItemUnderMouseToDrag].ItemArray;m_dataTable.Rows.RemoveAt(m_indexOfItemUnderMouseToDrag);if (m_indexOfItemUnderMouseToDrag < m_indexOfItemUnderMouseToDrop)m_indexOfItemUnderMouseToDrop--;m_dataTable.Rows.InsertAt(tempRow, m_indexOfItemUnderMouseToDrop);dgv_senceConfig_sence.ClearSelection();dgv_senceConfig_sence.CurrentCell = dgv_senceConfig_sence.Rows[m_indexOfItemUnderMouseToDrop].Cells[0];dgv_senceConfig_sence.CurrentCell.Selected = true;}private void dgv_senceConfig_sence_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e){//如果当前行是鼠标拖放过程的所在行if (e.RowIndex == m_indexOfItemUnderMouseOver)e.Graphics.FillRectangle(Brushes.Red, e.RowBounds.X, e.RowBounds.Y, e.RowBounds.Width, 2);}}
}

Winform中DataGridView中添加数据并且拖动整行相关推荐

  1. java获取word固定位置的值_java 实现保存Word文档中指定位置的数据,又保存整篇文档...

    1:需求 用户在线编辑完word 文档后希望保存整篇文档, 同时把保存文档中指定位置的数据 2:方案 用 pageoffice  实现既保存Word文档中指定位置的数据,又保存整篇文档 4:核心思想及 ...

  2. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间

    很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(500) , row ...

  4. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  5. 计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: http://www.cnblogs.com/lyhabc/p/3828496.html 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享 ...

  6. 【pandas】将单元格中的多个数据拆分为多行数据(explode),以csv文件为源文件进行处理

    [pandas]将单元格中的多个数据拆分为多行数据(explode) 1.原始数据(test.csv) 2.需求 将"别名"."科目"这两列中带有多个数据的单元 ...

  7. 如何将系统变量中的Path变量值由一整行变的条理清晰

    如何将系统变量中的Path变量值由一整行变的条理清晰 问题:在配置环境变量时,发现变量值呈现一整行的状态,不好查找需要的东西,如下图 解决方法:将C:\Windows\System32放在所有变量值前 ...

  8. 【WinForm】线程中向listview添加数据

    在使用listview的时候,因为处理的数据较多,为防止在处理数据时出现假死的状态出现卡的情况,我们使用委托进行处理添加数据 定义委托 private delegate void AddListVie ...

  9. WinForm 在DataGridView中查询

    向DataGridView中添加了一些数据,可以结合Linq查询,并让匹配查询的行高亮显示 建立如下界面 代码如下: using System; using System.Collections.Ge ...

最新文章

  1. Log4j使用详解(log4j.XML格式)——整理
  2. 数据结构1:单链表反转java代码解释
  3. 人工智能:第五章 计算智能(2)
  4. Struts2拦截器简单示例
  5. HNOI2008 玩具装箱
  6. rabbitmq多个消费者监听一个队列_RabbitMQ的六种工作模式
  7. P2396-yyylovesMathsVII【状压dp】
  8. Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用
  9. 计算机突然从桌面消失了,电脑桌面突然什么都没有了,怎么处理
  10. apache ,php,mysql的安装
  11. 进程已不存在,但端口仍被占用
  12. Apache从入门到精通
  13. 计算机键盘换挡键,电脑键盘上的换挡键是哪个
  14. CCNA学习指南 第八章 下载
  15. java ojdbc6_JAVA JDBC在连接ORACLE数据库时出现ojdbc6.jar has no source 问题?
  16. Linux rpm命令
  17. python字典找相同值_python-找出字典dic中重复值
  18. HTMl页面加入落叶下雨动画,基于HTML5+Webkit实现树叶飘落动画
  19. 微信小程序开发中调用button组件添加微信客服功能
  20. 计算机网络期末复习整理

热门文章

  1. Junit的入门知识
  2. 最新微信防红、防封技术系统原理
  3. 图书馆客流人数统计分析系统方案
  4. VR室内定位系统小结
  5. Adobe After Effects 2021 v18.2.1.8 特别版
  6. Box2D一:基础知识
  7. 抖音下拉宝说抖音下拉框有没有效果呢?
  8. 积水问题几种解决方案
  9. 基于stm32的两路正弦波相位差测量
  10. [转载]树莓派随身工具箱:中间人劫持获取控制权