datagridview行上下移动功能实现

来源:互联网 发布:阿里云的销售好累啊 编辑:程序博客网 时间:2024/06/04 23:25
<pre name="code" class="csharp">public partial class SetColumnsDialog : Form    {        //判断用户是否有更改动作        private bool IsSaved = false;        //存放内容数据Table        private DataTable dt = new DataTable();        //XML文件路径        private string _xmlpath = string.Empty;        public string XmlPath        {            set { _xmlpath = value; }        }        //不允许用户修改和移动的行        private List<string> _listrows = new List<string>();        public List<string> ListRows        {            set { _listrows = value; }        }        //设置某列是否只读 或者 可见        private List<TableAttribute> _listcolumns = new List<TableAttribute>();        public List<TableAttribute> ListColumns        {            set { _listcolumns = value; }        }        //判断用户是否更改了列名        private bool _isUpdColumns = false;        public bool IsUpdColumns        {            get { return _isUpdColumns; }        }        //构造函数        public SetColumnsDialog()        {            InitializeComponent();            GlobalStaticData.SetBackColor(this);            GlobalStaticData.SetButton(GlobalStaticData.GetChildControls<Button>(this));            GlobalStaticData.SetControlsfont(this.Controls);            foreach (DataGridViewColumn dgvcc in dgvAttributeSetting.Columns)            {                dgvcc.SortMode = DataGridViewColumnSortMode.NotSortable;            }        }        //构造函数-重载        public SetColumnsDialog(string sPath):this()        {            _xmlpath = sPath;        }        /// <summary>        /// 加载事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void SetColumnsDialog_Load(object sender, EventArgs e)        {            try            {                XmlDocument dom = new XmlDocument();                dom.Load(_xmlpath);                XmlNodeList xnl = dom.ChildNodes[1].ChildNodes;                DataRow dr = null;                foreach (XmlNode xn in xnl[0])                {                    if (xn.Name == "Index")                        dt.Columns.Add(xn.Name, typeof(double));                    else if (xn.Name == "Fixed")                        dt.Columns.Add(xn.Name, typeof(bool));                    else                        dt.Columns.Add(xn.Name);                }                for (int i = 0; i < xnl.Count; i++)                {                    dr = dt.NewRow();                    foreach (XmlNode xn in xnl[i])                    {                        dr[xn.Name] = xn.InnerText;                    }                    dt.Rows.Add(dr);                }                //取消自动生成列                this.dgvAttributeSetting.AutoGenerateColumns = false;                this.dgvAttributeSetting.DataSource = dt;                DataView dv = dt.DefaultView;                dv.Sort = "Fixed DESC,Index ASC";                this.dgvAttributeSetting.CellValueChanged += dgvAttributeSetting_CellValueChanged;                //设置哪些行不可编辑                foreach (DataGridViewRow dgv in dgvAttributeSetting.Rows)                {                    foreach (string s in _listrows)                    {                        if (s.Equals(dgv.Cells["ColName"].Value.ToString().Trim()))                        {                            //着色                            dgv.DefaultCellStyle.BackColor = Color.LightGray;                            //只读                            dgv.ReadOnly = true;                        }                    }                }                //设置某列是否只读 或者 可见                foreach (TableAttribute ta in _listcolumns)                {                    dgvAttributeSetting.Columns[ta.Name].Visible = ta.Visible;                    dgvAttributeSetting.Columns[ta.Name].ReadOnly = ta.Readonly;                }            }            catch (Exception ex)            {                LoggerBiovision.LogException("", ex, "初始化发生异常,异常为:" + ex.ToString());            }        }        /// <summary>        /// 上移        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btPre_Click(object sender, EventArgs e)        {            try            {                if (dgvAttributeSetting.SelectedRows.Count > 0)                {                    string value = dgvAttributeSetting.SelectedRows[0].Cells[0].Value.ToString();                    int index = dgvAttributeSetting.SelectedRows[0].Index;                    //判断当前行是否可以编辑和移动                    foreach (string s in _listrows)                    {                        if (s.Equals(dgvAttributeSetting.Rows[index].Cells["ColName"].Value.ToString().Trim()))                        {                            CountdownMsgFrm.ShowMsg("提示","当前行不可以编辑和移动!");                            return;                        }                    }                    if (index <= 0)                    {                        CountdownMsgFrm.ShowMsg("提示", "已经是第一项");                        return;                    }                    else if (dt.Rows[index]["Fixed"] != null && dt.Rows[index]["Fixed"].ToString() == "False" && dt.Rows[index - 1]["Fixed"].ToString() == "True")                    {                        CountdownMsgFrm.ShowMsg("提示", "非固定项不能在固定项前面");                        return;                    }                    //如果上行为不可编辑、不可移动                    foreach (string s in _listrows)                    {                        if (s.Equals(dgvAttributeSetting.Rows[index - 1].Cells["ColName"].Value.ToString().Trim()))                        {                            CountdownMsgFrm.ShowMsg("提示", "上一行不可以编辑和移动,不能再移了!");                            return;                        }                    }                    DataRow dr = dt.NewRow();                    foreach (DataColumn dc in dt.Columns)                    {                        if (dc.ColumnName == "Index")                        {                            dr["Index"] = int.Parse(dt.Rows[index - 1]["Index"].ToString());                            dt.Rows[index - 1]["Index"] = dt.Rows[index]["Index"];                        }                        else                            dr[dc.ColumnName] = dt.Rows[index][dc.ColumnName];                    }                    dt.Rows.RemoveAt(index);                    dt.Rows.InsertAt(dr, index - 1);                    this.dgvAttributeSetting.CurrentCell = this.dgvAttributeSetting.Rows[index - 1].Cells[0];                    IsSaved = true;                }            }            catch (Exception ex)            {               LoggerBiovision.LogException("", ex, "上移发生异常,异常为:" + ex.ToString());            }        }        /// <summary>        /// 下移        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btNex_Click(object sender, EventArgs e)        {            try            {                int index = dgvAttributeSetting.SelectedRows[0].Index;                //判断当前行是否可以编辑和移动                foreach (string s in _listrows)                {                    if (s.Equals(dgvAttributeSetting.Rows[index].Cells["ColName"].Value.ToString().Trim()))                    {                        CountdownMsgFrm.ShowMsg("提示", "当前行不可以编辑和移动!");                        return;                    }                }                if (index == dt.Rows.Count - 1)                {                    CountdownMsgFrm.ShowMsg("提示", "已经是最后一项!");                    return;                }                else if (dt.Rows[index]["Fixed"] != null && dt.Rows[index]["Fixed"].ToString() == "True" && dt.Rows[index + 1]["Fixed"].ToString() == "False")                {                    CountdownMsgFrm.ShowMsg("提示", "固定项不能在非固定项后面");                    return;                }                //如果上行为不可编辑、不可移动                foreach (string s in _listrows)                {                    if (s.Equals(dgvAttributeSetting.Rows[index + 1].Cells["ColName"].Value.ToString().Trim()))                    {                        CountdownMsgFrm.ShowMsg("提示", "下一行不可以编辑和移动,不能再移了!");                        return;                    }                }                DataRow dr = dt.NewRow();                foreach (DataColumn dc in dt.Columns)                {                    if (dc.ColumnName == "Index")                    {                        dr["Index"] = int.Parse(dt.Rows[index + 1]["Index"].ToString());                        dt.Rows[index + 1]["Index"] = dt.Rows[index]["Index"];                    }                    else                        dr[dc.ColumnName] = dt.Rows[index][dc.ColumnName];                }                dt.Rows.RemoveAt(index);                dt.Rows.InsertAt(dr, index + 1);                this.dgvAttributeSetting.CurrentCell = this.dgvAttributeSetting.Rows[index + 1].Cells[0];                IsSaved = true;            }            catch (Exception ex)            {                LoggerBiovision.LogException("", ex, "下移发生异常,异常为:" + ex.ToString());            }        }        /// <summary>        /// 保存        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btSave_Click(object sender, EventArgs e)        {            try            {                XmlDocument doc = new XmlDocument();                File.CreateText(_xmlpath).Dispose();                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);                doc.AppendChild(dec);                //创建一个根节点(一级)                XmlElement root = doc.CreateElement("List");                doc.AppendChild(root);                int i = 1;                //创建节点(二级)                foreach (DataGridViewRow Row in dgvAttributeSetting.Rows)                {                    XmlNode node = doc.CreateElement(Row.Cells["ColName"].Value.ToString());                    XmlElement element1 = doc.CreateElement("Name");                    element1.InnerText = Row.Cells["ColName"].Value.ToString();                    node.AppendChild(element1);                    XmlElement element2 = doc.CreateElement("Text");                    element2.InnerText = Row.Cells["ColText"].Value.ToString();                    node.AppendChild(element2);                    XmlElement element3 = doc.CreateElement("Visible");                    element3.InnerText = Row.Cells["ColVisible"].EditedFormattedValue.ToString();                    node.AppendChild(element3);                    XmlElement element4 = doc.CreateElement("Fixed");                    element4.InnerText = Row.Cells["ColFixed"].EditedFormattedValue.ToString();                    node.AppendChild(element4);                    XmlElement element5 = doc.CreateElement("Width");                    element5.InnerText = Row.Cells["ColWidth"].EditedFormattedValue.ToString();                    node.AppendChild(element5);                    XmlElement element6 = doc.CreateElement("Index");                    element6.InnerText = i.ToString();                    node.AppendChild(element6);                    root.AppendChild(node);                    i++;                }                doc.Save(_xmlpath);                IsSaved = false;                DialogResult = DialogResult.OK;                this.Close();            }            catch (Exception ex)            {                LoggerBiovision.LogException("", ex, "保存发生异常,异常为:" + ex.ToString());                CountdownMsgFrm.ShowMsg("错误", "保存失败");                DialogResult = DialogResult.Cancel;            }        }        //判断用户是否有改变        private void dgvAttributeSetting_CellValueChanged(object sender, DataGridViewCellEventArgs e)        {            try            {                if (e.RowIndex > -1)                {                    IsSaved = true;                    if (e.ColumnIndex == dgvAttributeSetting.Columns["ColText"].Index)                    {                        _isUpdColumns = true;                    }                }            }            catch (Exception ex)            {               LoggerBiovision.LogException("", ex, "修改发生异常,异常为:" + ex.ToString());            }        }        //窗体关闭事件        private void SetColumnsDialog_FormClosing(object sender, FormClosingEventArgs e)        {            try            {                if (IsSaved == true)                {                    MyAskMessageBox res = new MyAskMessageBox("Single", "当前有改动,要保存吗?", "询问", "是", "否", MessageBoxIcon.Question);                    res.StartPosition = FormStartPosition.CenterParent;                    res.ShowDialog(this);                    if (res.DialogResult == DialogResult.Yes)                        btSave_Click(null, null);                }            }            catch (Exception ex)            {                LoggerBiovision.LogException("", ex, "关闭发生异常,异常为:" + ex.ToString());            }        }        //取消        private void btCancel_Click(object sender, EventArgs e)        {            try            {                IsSaved = false;                DialogResult = DialogResult.Cancel;                this.Close();            }            catch (Exception ex)            {                LoggerBiovision.LogException("", ex, "取消发生异常,异常为:" + ex.ToString());            }        }    }    //表格属性类    public class TableAttribute    {        //列名        private string _name;        public string Name        {            get { return _name; }            set { _name = value; }        }        //是否只读        private bool _readonly;        public bool Readonly        {            get { return _readonly; }            set { _readonly = value; }        }        //是否可见        private bool _visible;        public bool Visible        {            get { return _visible; }            set { _visible = value; }        }    }


                                             
0 0