Winform中DataGridView中添加数据并且拖动整行

14 篇文章 0 订阅

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;
        #endregion
        public 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;
                    //获取设备uuid
                    m_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);
                    #endregion

                    Dictionary<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);
            }
            else
                m_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);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值