using static Hydro.MapViewEnum; namespace Hydro { public partial class PropertyForm : XtraUserControl { private IBaseViewModel _selectedObject; private MapObjectType _selectedType= MapObjectType.全部; private List selectionSets; public SelectionSet selectionSet=new SelectionSet(); private Form fr = null; public PropertyForm() { InitializeComponent(); } public void SetEnabled(bool isReadOnly) { _isEnable = isReadOnly; } public void SetWindows(Form mg) { if (mg.WindowState == FormWindowState.Maximized) { //this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制 this.Height = mg.Height-50; this.Location = new Point(mg.Left + mg.Width -this.Width, mg.Top+50); //设置新窗体位置,当前窗体的右侧(X轴方向) } else { //this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制 this.Height = mg.Height; this.Location = new Point(mg.Left + mg.Width - 15, mg.Top); //设置新窗体位置,当前窗体的右侧(X轴方向) } fr = mg; //GlobalObject.PropertyForm.Show(); } public Form GetWindow() { return this.fr; } public void SetObj(object o) { propertyGrid.SelectedObject = o; this.Text= o.GetType().Name; } public void SetObj(IBaseViewModel selectedObject) { lock(selectedObject) { _selectedObject = selectedObject; if (_selectedObject is JunctionViewModel junc) { _selectedType = MapObjectType.节点; propertyGrid.SelectedObjects = new JunctionViewModel[] { junc }; } else if (_selectedObject is ReservoirViewModel res) { _selectedType = MapObjectType.水库; propertyGrid.SelectedObjects = new ReservoirViewModel[] { res }; } else if (_selectedObject is TankViewModel tank) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObjects = new TankViewModel[] { tank }; } else if (_selectedObject is PipeViewModel pipe) { _selectedType = MapObjectType.管线; propertyGrid.SelectedObjects = new PipeViewModel[] { pipe }; } else if (_selectedObject is ValveViewModel valve) { _selectedType = MapObjectType.阀门; propertyGrid.SelectedObjects = new ValveViewModel[] { valve }; } else if (_selectedObject is RepeaterViewModel repeater) { _selectedType = MapObjectType.重复器; propertyGrid.SelectedObjects = new RepeaterViewModel[] { repeater }; } //水表 else if (_selectedObject is MeterViewModel meter) { _selectedType = MapObjectType.水表; propertyGrid.SelectedObjects = new MeterViewModel[] { meter }; } //水泵 else if (_selectedObject is PumpViewModel pump) { _selectedType = MapObjectType.水泵; propertyGrid.SelectedObjects = new PumpViewModel[] { pump }; } //喷头Nozzle else if (_selectedObject is NozzleViewModel nozzle) { _selectedType = MapObjectType.喷头; propertyGrid.SelectedObjects = new NozzleViewModel[] { nozzle }; } else { _selectedType = MapObjectType.全部; propertyGrid.SelectedObjects =new IBaseViewModel[] { selectedObject }; } switch (_selectedType) { case MapObjectType.节点: Text = "节点 Properties"; break; case MapObjectType.水库: Text = "水库 Properties"; break; case MapObjectType.水池: Text = "水池 Properties"; break; case MapObjectType.管线: Text = "管线 Properties"; break; case MapObjectType.阀门: Text = "阀门 Properties"; break; case MapObjectType.重复器: Text = "重复器 Properties"; break; } } } public void SetNet(MapViewNetWork net) { selectionSet.net = net; } public void SetObjs(List selectedObjects) { if (selectedObjects == null) return; selectedObjects.RemoveAll(obj => obj == null); selectedObjects.ForEach(obj => { if (obj.Tags==null) { obj.Tags = new TagList(); } }); selectionSet.selectedObjects = selectedObjects.ToList(); if (selectedObjects.Count ==1) SetObj(selectedObjects[0]); else ShowProperties(selectedObjects); if (selectionSet.OnlyViewSelected) RefreshListBox(); } private void PropertyForm_Load_1(object sender, EventArgs e) { foreach (var item in Enum.GetValues(typeof(MapObjectType))) { comboBox_type.Items.Add(item); } comboBox_type.SelectedIndex = 0; selectionSets = new List(); selectionSet = new SelectionSet(); listBox1.DataSource = selectionSet.View; //listBox1.DisplayMember = "IDType"; } private void comboBox_type_SelectedIndexChanged(object sender, EventArgs e) { RefreshListBox(); } void RefreshListBox() { if (selectionSet == null) return; if (comboBox_type.Items.Count<1) { foreach (var item in Enum.GetValues(typeof(MapObjectType))) { comboBox_type.Items.Add(item); } comboBox_type.SelectedIndex = 0; } string txt = comboBox_type.SelectedItem.ToString(); MapObjectType selectedType = (MapObjectType)Enum.Parse(typeof(MapObjectType), txt); // 使用 LINQ 查询筛选选择集 selectionSet.filterType = selectedType; selectionSet.FilterString = textBox_search.Text; listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; //listBox1.DisplayMember = "ID"; //// 重新绑定选择集列表 //listBox1.DataSource = selectionSet.View; listBox1.DataSource = null; //listBox1.DisplayMember = "IDType"; listBox1.DataSource = selectionSet.View; listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedItems.Count == 0) { return; } else if (listBox1.SelectedItems.Count == 1) { var objID = listBox1.SelectedItems[0]; var findlist = selectionSet.net.MapObjects.FindAll(o => o.ID == objID); if (findlist.Count <= 0) return; IBaseViewModel mapObject = findlist[0];// selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)listBox1.SelectedItems[0]).ID); if (mapObject != null) SetObj(mapObject); GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ; GlobalObject.map.selectedObjs.Clear(); GlobalObject.map.selectedObjs.Add(mapObject); mapObject.Selected = true; GlobalObject.map.SetMapInvalidate(); } else { List list = new List(); foreach (var o in listBox1.SelectedItems) { var objID = listBox1.SelectedItems[0]; IBaseViewModel mapObject = selectionSet. net.MapObjects.FindAll(obj => obj.ID == objID)[0]; list.Add(mapObject); } ShowProperties( list); GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ; GlobalObject.map.selectedObjs.Clear(); list.ForEach(o=>o.Selected=true); GlobalObject.map.selectedObjs.AddRange(list); GlobalObject.map.SetMapInvalidate(); } } private void listBox1_DoubleClick(object sender, EventArgs e) { if (listBox1.SelectedItems.Count == 1) { //IBaseViewModel mapObject = (IBaseViewModel)listBox1.SelectedItems[0]; var objID = listBox1.SelectedItems[0]; IBaseViewModel mapObject = selectionSet.net.MapObjects.FindAll(obj => obj.ID == objID)[0]; GlobalObject.map.setCenter (mapObject); GlobalObject.map.SetMapInvalidate(); } } private void PropertyForm_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; this.Hide(); } bool _isEnable = true; private static Dictionary> _selectedObjectsDict = new Dictionary>(); private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { //foreach (var item in listBox1.SelectedItems) //{ // var mapObject = selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)item).ID); // if (e.ChangedItem.Label == " 批次编号 ") // { // mapObject.Level = (int)e.ChangedItem.Value; // } //} if (!_isEnable) { MessageBox.Show("当前状态的修改将不会被保存","重复器展开中"); _isEnable = true; } //object firstObj = selectionSet.selectedObjects.First(); //if (_selectedObjectsDict[firstObj].Contains(e.ChangedItem.Label)) //{ // foreach (var obj in selectionSet.selectedObjects) // { // var props = TypeDescriptor.GetProperties(obj); // foreach (PropertyDescriptor prop in props) // { // if (prop.Name == e.ChangedItem.Label) // { // prop.SetValue(obj, e.ChangedItem.Value); // break; // } // } // } //} GlobalObject.map.SetMapInvalidate(); } public void ShowProperties(IEnumerable selectedObjects) { IBaseViewModel[] objs = null; try { if (selectedObjects!=null) objs= selectedObjects.ToArray(); } catch { return; } propertyGrid.SelectedObjects = objs; } private void textBox_search_TextChanged(object sender, EventArgs e) { RefreshListBox(); } private void checkBox_OnlyShowSelected_CheckedChanged(object sender, EventArgs e) { selectionSet.OnlyViewSelected = checkBox_OnlyShowSelected.Checked; RefreshListBox(); } private void label_lock_Click(object sender, EventArgs e) { var label_lock = (Label)sender; GlobalObject.LockSelect=!GlobalObject.LockSelect; if (GlobalObject.LockSelect) { label_lock.BackColor = Color.Blue; label_lock.Text = "🔒"; } else { label_lock.BackColor = Color.Green; label_lock.Text = "🔓"; } } private void label_filter_Click(object sender, EventArgs e) { var label_lock = (Label)sender; TagList tags = new TagList(); var mobjs=selectionSet.OnlyViewSelected? selectionSet.selectedObjects:selectionSet.net.MapObjects; foreach (var item in mobjs) { tags.AddRange(item.Tags); } var t = tags.Distinct().ToList(); tags.Clear(); tags.AddRange(t); var form = new FormFilter(tags); if (form.ShowDialog() == DialogResult.OK) { selectionSet.FilterTags = form.Tags; selectionSet.rules = form.rules; GlobalObject.ApplyFilter=selectionSet.FilterTags.Count > 0 || selectionSet.rules.Count > 0; if (GlobalObject.ApplyFilter) { label_lock.BackColor = Color.Blue; label_lock.Text = "⏬"; } else { label_lock.BackColor = Color.Green; label_lock.Text = "🔽"; } RefreshListBox(); } } private void PropertyForm_KeyDown(object sender, KeyEventArgs e) { //Ctrl+A,则选中当前listbox中的所有项 if (e.Control && e.KeyCode == Keys.A) { for (int i = 0; i < listBox1.Items.Count; i++) { listBox1.SetSelected(i, true); } } } private void 全选ToolStripMenuItem_Click(object sender, EventArgs e) { listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; for (int i = 0; i < listBox1.Items.Count; i++) { listBox1.SetSelected(i, true); } listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; this.propertyGrid.SelectedObjects =selectionSet. CurrentSelectedObjects?.ToArray(); GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); if (selectionSet.CurrentSelectedObjects!=null) { GlobalObject.map.selectedObjs.AddRange(selectionSet.CurrentSelectedObjects); selectionSet.CurrentSelectedObjects.ForEach(o => { o.Selected = true; }); } GlobalObject.map.SetMapInvalidate(); } private void listBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (listBox1.SelectedItems.Count > 0) { contextMenuStrip1.Show(listBox1, e.Location); } } } } /*public class SelectionSet { public string Name; public MapObjectType filterType=MapObjectType.全部; public string FilterString { get; set; } = ""; public TagList FilterTags { get; set; } = new TagList(); public List> rules = new List>(); public List FilterTypes = new List(); public MapViewNetWork net { get; set; } = null; public bool OnlyViewSelected { get; set; } = true; public List selectedObjects=new List(); public List CurrentSelectedObjects=new List(); public List View { get { List originList; List list; List list_result=new List(); if (!OnlyViewSelected && net != null) { originList = net.MapObjects; } else { originList = selectedObjects; } if (filterType == MapObjectType.全部) { list = originList; } else { var filteredSets = from obj in originList where obj.GetType() == filterType.GetObjType() select obj; list = filteredSets?.ToList(); } if (FilterString!=null && FilterString!="") { list = list?.FindAll(o => o.ID.IndexOf(FilterString) >= 0); } if (FilterTags.Count>0)//使用表达式,对结果进行筛选 { foreach (var tag in FilterTags) { var filteredSets = from obj in list where obj.Tags.Contains(tag) select obj; list = filteredSets?.ToList(); } } if(rules.Count>0) { foreach (var rule in rules) { var filteredSets = from obj in list where rule(obj) select obj; list = filteredSets?.ToList(); } } CurrentSelectedObjects = list; list_result = list.Select(o => o.ID).ToList(); return list_result; } } }*/ }