首先成果是:添加了的文件,会显示在地图文件框中
image.png
如图:
image.png
这是用GridControl和DockPanel做成的置于整个窗体界面中—-之后后续会介绍DockPanel是怎么用的
首先都知道GridControl是需要DatatTable的,并且添加文件即是增加DataRow的过程,关闭文件则是关闭打了对勾的行

一、首先要绑定DataTable及设计地图文件框

image.png
这五个即是我需要的文件属性
是否显示、是否连线、是否锁定、是否选择—都是bool,名称-string
SetOrdinal(i)—这个方法是用来放置DataColumn的顺序

1对于bool类型的,我都添加了各自的repositoryItemCheckEdit——在ColumnEdit中一共有四个

image.png
或者找到Repository中添加或删除
image.png

2.同时我们需要设置Columns的FieldName——即 IsChoose(选择)、IsOverlayVisible(显示)、IsLine(连线)、IsLocked(锁定)、 还有Name(名称)

对于bool类型的,我都设置了AllowEdit-可编辑-true
对于string,我设置了AllowEdit不可编辑-false

3.其他的属性-如AllowFilter、AllowSort,都设置为了false,目的是为了实现全选功能

image.png

二、主要代码

初始设定数据源

  1. //添加一个用来绑定的DataTable字段
  2. public DataTable chooseFiles=new DataTable();
  3. //添加了一个文件路径字段
  4. public List<string> FilePaths=new List<string>();
  5. //这个是我自己这个东西的功能--可以不用
  6. //打开文件的地理点的信息用于检查,这个哈希表包括了地图文件的路径,和地图文件中提取出来的图层
  7. public System.Collections.Hashtable Hashtable = new System.Collections.Hashtable();
  8. /// <summary>
  9. /// 文件管理框的初始化
  10. /// </summary>
  11. void InitialBindingDataTable()
  12. {
  13. chooseFiles.Columns.Add("IsChoose", typeof(bool)).SetOrdinal(0);
  14. chooseFiles.Columns.Add("IsOverlayVisible", typeof(bool)).SetOrdinal(1);
  15. chooseFiles.Columns.Add("IsLine", typeof(bool)).SetOrdinal(2);
  16. chooseFiles.Columns.Add("IsLocked", typeof(bool)).SetOrdinal(3);
  17. chooseFiles.Columns.Add("Name");
  18. this.gridControl1.DataSource = chooseFiles;
  19. }

之后改变这个DataTable就会有改变
打开文件的过程是—打开文件,添加至FilePaths,然后添加至DataTable—即AddFileRow方法
这里我写了两个
一个是设定自己定义的,只用提供文件名称进行添加,因为bool数据类型的都是复选框

添加数据行

  1. /// <summary>
  2. /// 在地图文件添加新栏
  3. /// </summary>
  4. /// <param name="filename">文件名称</param>
  5. private void AddFileRow(string filename)
  6. {
  7. DataRow dr = chooseFiles.NewRow();
  8. dr["IsChoose"] = false;//选择状态
  9. dr["IsOverlayVisible"] = true;//显示
  10. dr["IsLine"] = true;//连线状态
  11. dr["IsLocked"] = true;//锁定状态即不可编辑
  12. dr["Name"] = filename.Substring(filename.LastIndexOf("\\") + 1);
  13. chooseFiles.Rows.Add(dr);
  14. }
  15. /// <summary>
  16. /// 在文件管理栏添加新栏
  17. /// </summary>
  18. /// <param name="filename">文件名称</param>
  19. /// <param name="isChoose">图层是否选择</param>
  20. /// <param name="isOverlayVisible">图层是否显示</param>
  21. /// <param name="isLine">是否连线</param>
  22. /// <param name="isLocked">是否锁定</param>
  23. private void AddFileRow(string filename, bool isChoose, bool isOverlayVisible, bool isLine, bool isLocked)
  24. {
  25. DataRow dr = chooseFiles.NewRow();
  26. dr["IsChoose"] = isChoose;//选择状态
  27. dr["IsOverlayVisible"] = isOverlayVisible;//显示
  28. dr["IsLine"] = isLine;//连线状态
  29. dr["IsLocked"] = isLocked;//锁定状态即不可编辑
  30. dr["Name"] = filename.Substring(filename.LastIndexOf("\\") + 1);
  31. chooseFiles.Rows.Add(dr);
  32. }

点击复选框改变值…………值改变触发事件

  1. #region 点击复选框改变数据表值
  2. private void SetCheckStateValue(DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
  3. {
  4. string val = "";
  5. if (e.Value != null)
  6. {
  7. val = e.Value.ToString();
  8. }
  9. else
  10. {
  11. val = "True";//默认为选中
  12. }
  13. switch (val)
  14. {
  15. case "True":
  16. e.CheckState = CheckState.Checked;
  17. break;
  18. case "False":
  19. e.CheckState = CheckState.Unchecked;
  20. break;
  21. case "Yes":
  22. goto case "True";
  23. case "No":
  24. goto case "False";
  25. case "1":
  26. goto case "True";
  27. case "0":
  28. goto case "False";
  29. default:
  30. e.CheckState = CheckState.Checked;
  31. break;
  32. }
  33. e.Handled = true;
  34. }

为了实现点击复选框实现DataTable值的改变所以必须在QueryCheckStateByValue中实现
否则点击复选框出现无效情况

  1. private void repositoryItemCheckEdit1_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
  2. {
  3. SetCheckStateValue(e);
  4. }
  1. <br />如果DataTable的值改变需要对应事件则应该在RepositoryItemCheckEdit的CheckedChanged中写
//选择
        private void repositoryItemCheckEdit1_CheckedChanged(object sender, EventArgs e)
        {
            if (!gridView8.IsNewItemRow(gridView1.FocusedRowHandle))
            {
                gridView8.CloseEditor();
                gridView8.UpdateCurrentRow();
            }
            CheckState check = (sender as DevExpress.XtraEditors.CheckEdit).CheckState;
            if (check == CheckState.Checked)
            {
                //事件
            }
            else
            {
                //事件
            }
        }

/////////////////////////////其他的一些事件

//连线
        private void repositoryItemCheckEdit2_CheckedChanged(object sender, EventArgs e)
        {
            if (!gridView8.IsNewItemRow(gridView8.FocusedRowHandle))
            {
                gridView8.CloseEditor();
                gridView8.UpdateCurrentRow();
            }
            CheckState check = (sender as DevExpress.XtraEditors.CheckEdit).CheckState;
            int index = this.gridView8.FocusedRowHandle;
            string name = this.gridView8.GetRowCellDisplayText(index, "Name");
            if (check == CheckState.Checked)
            {
                //事件
                SetIsLine(name, true);
            }
            else
            {
                SetIsLine(name, false);
            }
        }
        //锁定
        private void repositoryItemCheckEdit3_CheckedChanged(object sender, EventArgs e)
        {
            if (!gridView8.IsNewItemRow(gridView8.FocusedRowHandle))
            {
                gridView8.CloseEditor();
                gridView8.UpdateCurrentRow();
            }
            ///
            CheckState check = (sender as DevExpress.XtraEditors.CheckEdit).CheckState;
            int index = this.gridView8.FocusedRowHandle;
            string name = this.gridView8.GetRowCellDisplayText(index, "Name");
            //
            var overlay = gMapOverlays.Find(a => a.Id == name.Trim());
            var attribute = customAttributes.Find(a => a.LineName == overlay.Id);
            if (check == CheckState.Checked)
            {
                //事件
                if (chooseLocked.Contains(name))
                {
                    attribute.IsEditable = false;
                }
                else
                {
                    chooseLocked.Add(name);
                }
            }
            else
            {
                if (chooseLocked.Contains(name))
                {
                    chooseLocked.Remove(name);
                    attribute.IsEditable = true;
                }
            }
            SetCurrentCustomAttribute(overlay.Id);
            this.propertyGrid.Refresh();
        }
        //显示
        private void repositoryItemCheckEdit4_CheckedChanged(object sender, EventArgs e)
        {
            if (!gridView8.IsNewItemRow(gridView8.FocusedRowHandle))
            {
                gridView8.CloseEditor();
                gridView8.UpdateCurrentRow();
            }
            CheckState check = (sender as DevExpress.XtraEditors.CheckEdit).CheckState;
            int index = this.gridView8.FocusedRowHandle;
            string name = this.gridView8.GetRowCellDisplayText(index, "Name");
            //
            var overlay = gMapOverlays.Find(a => a.Id == name.Trim());
            var attribute = customAttributes.Find(a => a.LineName == overlay.Id);
            if (check == CheckState.Checked)
            {
                //事件
                overlay.IsVisibile = true;
                attribute.IsVisible = false;
            }
            else
            {
                overlay.IsVisibile = false;
                attribute.IsVisible = true;
            }
            SetCurrentCustomAttribute(overlay.Id);
            this.propertyGrid.Refresh();
        }

关闭所有选择的文件

注意选择和删除都用的是gridView中的方法

        /// <summary>
        /// 关闭且删除当前文件
        /// </summary>
        public void DoDelete()
        {
            List<string> selectedFiles = GetSelectFiles();//从DataTable中获得checked的文件
            if (selectedFiles != null && selectedFiles.Count != 0)
            {
                foreach (string s in selectedFiles)
                {
                    var obj = FilePaths.Find(a => a.Contains(s));
                    FilePaths.Remove(obj);//从保存文件路径的全局变量中删除文件
                    Hashtable.Remove(s);//从哈希表删除关闭的文件
                }
            }
            this.gridView8.DeleteSelectedRows();
            gridView8.RefreshData();
            this.gridView8.OptionsBehavior.Editable = true;
        }

        /// <summary>
        /// 获取地图文件选择列的文件
        /// </summary>
        /// <returns></returns>
        private List<string> GetSelectFiles()
        {
            List<string> selectedFiles = new List<string>();
            for (int i = 0; i < gridView8.DataRowCount; i++)
            {
                var value = gridView8.GetDataRow(i)["IsChoose"].ToString().Trim();
                if (value == "True")//选择
                {
                    gridView8.SelectRow(i);
                    selectedFiles.Add(gridView8.GetDataRow(i)["Name"].ToString().Trim());
                }
                else if (value == "False")
                {
                    gridView8.UnselectRow(i);
                    continue;
                }
            }
            return selectedFiles;
        }

容易出现的一个问题是,为什么关闭时只会关闭一行,此时需要设置gridView中的
image.png
一定要选择MultiSelect为true!!!否则只能删除其中一行/或不正确的行数
image.png

点击表头选择所有复选框

private void gridView8_Click(object sender, EventArgs e)
        {
            try
            {
                Point pt = gridControl1.PointToClient(Control.MousePosition);
                DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo info = gridView8.CalcHitInfo(pt);
                if (info.InColumn && info.Column != null)
                {
                    string s = info.Column.FieldName.ToString();
                    switch (s)
                    {
                        case "IsChoose":
                            SetAllCheck("IsChoose", GetIsAllCheck("IsChoose"));
                            break;
                        case "IsOverlayVisible":
                            SetAllCheck("IsOverlayVisible", GetIsAllCheck("IsOverlayVisible"));
                            SetAllIsVisible();//全选/全不选的显示操作
                            break;
                        case "IsLine":
                            SetAllCheck("IsLine", GetIsAllCheck("IsLine"));
                            SetAllIsLine();//全选/全不选的连线操作
                            break;
                        case "IsLocked":
                            SetAllCheck("IsLocked", GetIsAllCheck("IsLocked"));

                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message);
                XtraMessageBox.Show(ex.Message);
            }
        }


/// <summary>
        /// 设置GridView8某列全选
        /// </summary>
        /// <param name="columnFieldName">列的FieldName</param>
        /// <param name="checkState">选中状态</param>
        private void SetAllCheck(string columFieldName, bool checkState)
        {
            for (int i = 0; i < gridView8.DataRowCount; i++)
            {
                gridView8.SetRowCellValue(i, gridView8.Columns[columFieldName], checkState);
            }
            gridControl1.Refresh();
            gridView8.RefreshData();
        }

        /// <summary>
        /// GridView8判断某列是否全选
        /// </summary>
        private bool GetIsAllCheck(string columnFieldName)
        {
            DataTable dt = (DataTable)this.gridControl1.DataSource;
            //如果不是全选,则返回全选,是全选返回未选
            List<bool> states = new List<bool>();
            for (int j = 0; j < dt.Rows.Count; j++)
            {
                var state = dt.Rows[j][columnFieldName];
                states.Add(Convert.ToBoolean(state));
            }
            if (states.TrueForAll(a => a))//判断是否全为false(全未选)-true;不是全选(即全为false)的情况下就返回false
            {
                //全为true返回false
                return false;
            }
            else
            {
                //否则返回true
                return true;
            }
        }

现在基本上实现了添加、选择、删除、全选的功能