首先成果是:添加了的文件,会显示在地图文件框中
如图:
这是用GridControl和DockPanel做成的置于整个窗体界面中—-之后后续会介绍DockPanel是怎么用的
首先都知道GridControl是需要DatatTable的,并且添加文件即是增加DataRow的过程,关闭文件则是关闭打了对勾的行
一、首先要绑定DataTable及设计地图文件框
这五个即是我需要的文件属性
是否显示、是否连线、是否锁定、是否选择—都是bool,名称-string
SetOrdinal(i)—这个方法是用来放置DataColumn的顺序
1对于bool类型的,我都添加了各自的repositoryItemCheckEdit——在ColumnEdit中一共有四个
2.同时我们需要设置Columns的FieldName——即 IsChoose(选择)、IsOverlayVisible(显示)、IsLine(连线)、IsLocked(锁定)、 还有Name(名称)
对于bool类型的,我都设置了AllowEdit-可编辑-true
对于string,我设置了AllowEdit不可编辑-false
3.其他的属性-如AllowFilter、AllowSort,都设置为了false,目的是为了实现全选功能
二、主要代码
初始设定数据源
//添加一个用来绑定的DataTable字段
public DataTable chooseFiles=new DataTable();
//添加了一个文件路径字段
public List<string> FilePaths=new List<string>();
//这个是我自己这个东西的功能--可以不用
//打开文件的地理点的信息用于检查,这个哈希表包括了地图文件的路径,和地图文件中提取出来的图层
public System.Collections.Hashtable Hashtable = new System.Collections.Hashtable();
/// <summary>
/// 文件管理框的初始化
/// </summary>
void InitialBindingDataTable()
{
chooseFiles.Columns.Add("IsChoose", typeof(bool)).SetOrdinal(0);
chooseFiles.Columns.Add("IsOverlayVisible", typeof(bool)).SetOrdinal(1);
chooseFiles.Columns.Add("IsLine", typeof(bool)).SetOrdinal(2);
chooseFiles.Columns.Add("IsLocked", typeof(bool)).SetOrdinal(3);
chooseFiles.Columns.Add("Name");
this.gridControl1.DataSource = chooseFiles;
}
之后改变这个DataTable就会有改变
打开文件的过程是—打开文件,添加至FilePaths,然后添加至DataTable—即AddFileRow方法
这里我写了两个
一个是设定自己定义的,只用提供文件名称进行添加,因为bool数据类型的都是复选框
添加数据行
/// <summary>
/// 在地图文件添加新栏
/// </summary>
/// <param name="filename">文件名称</param>
private void AddFileRow(string filename)
{
DataRow dr = chooseFiles.NewRow();
dr["IsChoose"] = false;//选择状态
dr["IsOverlayVisible"] = true;//显示
dr["IsLine"] = true;//连线状态
dr["IsLocked"] = true;//锁定状态即不可编辑
dr["Name"] = filename.Substring(filename.LastIndexOf("\\") + 1);
chooseFiles.Rows.Add(dr);
}
/// <summary>
/// 在文件管理栏添加新栏
/// </summary>
/// <param name="filename">文件名称</param>
/// <param name="isChoose">图层是否选择</param>
/// <param name="isOverlayVisible">图层是否显示</param>
/// <param name="isLine">是否连线</param>
/// <param name="isLocked">是否锁定</param>
private void AddFileRow(string filename, bool isChoose, bool isOverlayVisible, bool isLine, bool isLocked)
{
DataRow dr = chooseFiles.NewRow();
dr["IsChoose"] = isChoose;//选择状态
dr["IsOverlayVisible"] = isOverlayVisible;//显示
dr["IsLine"] = isLine;//连线状态
dr["IsLocked"] = isLocked;//锁定状态即不可编辑
dr["Name"] = filename.Substring(filename.LastIndexOf("\\") + 1);
chooseFiles.Rows.Add(dr);
}
点击复选框改变值…………值改变触发事件
#region 点击复选框改变数据表值
private void SetCheckStateValue(DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
{
string val = "";
if (e.Value != null)
{
val = e.Value.ToString();
}
else
{
val = "True";//默认为选中
}
switch (val)
{
case "True":
e.CheckState = CheckState.Checked;
break;
case "False":
e.CheckState = CheckState.Unchecked;
break;
case "Yes":
goto case "True";
case "No":
goto case "False";
case "1":
goto case "True";
case "0":
goto case "False";
default:
e.CheckState = CheckState.Checked;
break;
}
e.Handled = true;
}
为了实现点击复选框实现DataTable值的改变所以必须在QueryCheckStateByValue中实现
否则点击复选框出现无效情况
private void repositoryItemCheckEdit1_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
{
SetCheckStateValue(e);
}
<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中的
一定要选择MultiSelect为true!!!否则只能删除其中一行/或不正确的行数
点击表头选择所有复选框
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;
}
}
现在基本上实现了添加、选择、删除、全选的功能