using Hydro.MapView; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.CompilerServices; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Hydro.MapView.MapViewEnum; using Hydro.MapView.Common; namespace Hydro.MapUI { public partial class PropertyForm : UserControl { 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) { //_selectedObject = selectedObject; if (_selectedObject is JunctionViewModel junc) { _selectedType = MapObjectType.节点; propertyGrid.SelectedObject = junc; } else if (_selectedObject is ReservoirViewModel reser) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject = reser; } else if (_selectedObject is TankViewModel tank) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject =tank; } else if (_selectedObject is PipeViewModel pipe) { _selectedType = MapObjectType.管线; propertyGrid.SelectedObject = pipe; } else if (_selectedObject is RepeaterViewModel repeater) { _selectedType = MapObjectType.重复器; propertyGrid.SelectedObject = repeater; } else if (_selectedObject is ValveViewModel valve) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject = valve; } else { _selectedType = MapObjectType.全部; propertyGrid.SelectedObject = 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) { selectionSet.selectedObjects = selectedObjects.ToList(); if (selectedObjects.Count ==1) SetObj(selectedObjects[0]); else ShowProperties(selectedObjects); if (selectionSet.OnlyViewSelected) RefleshListBox(); //listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; ////listBox1.DataSource = null; ////listBox1.DataSource = selectionSet.View; //listBox1.DataSource = null; //listBox1.DisplayMember = "ID"; //listBox1.DataSource = selectionSet.View; ////listBox1.DisplayMember = "ID"; //listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; } private void PropertyForm_Load_1(object sender, EventArgs e) { comboBox_type.DataSource = Enum.GetValues(typeof(MapObjectType)); 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) { RefleshListBox(); } void RefleshListBox() { if (selectionSet == null) return; 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]; IBaseViewModel mapObject =selectionSet. net.MapObjects.FindAll(o =>o.ID== objID)[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.SetInvalidated(); } 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.SetInvalidated(); //if (selectedObjects.Count == 1) // SetObj(selectedObjects[0]); //else // ShowProperties(selectedObjects); } } 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.SetInvalidated(); } } 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.SetInvalidated(); } public void ShowProperties(IEnumerable selectedObjects) { var pg = this.propertyGrid; if(pg!=null && selectedObjects!=null) { pg.SelectedObjects = selectedObjects.ToArray(); } //var objs = selectedObjects.ToList(); //objs.Sort((a, b) => { return String.Compare(a.ID, b.ID); }); //pg.SelectedObjects = objs.ToArray(); // 设置 PropertyGrid 的 PropertyValueChanged 事件处理程序 } private void textBox_search_TextChanged(object sender, EventArgs e) { RefleshListBox(); } private void checkBox_OnlyShowSelected_CheckedChanged(object sender, EventArgs e) { selectionSet.OnlyViewSelected = checkBox_OnlyShowSelected.Checked; RefleshListBox(); } } public class SelectionSet { public string Name; public MapObjectType filterType=MapObjectType.全部; public string FilterString { get; set; } = ""; public MapViewNetWork net { get; set; } = null; public bool OnlyViewSelected { get; set; } = true; public List selectedObjects=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); } list_result = list.Select(o => o.ID).ToList(); return list_result; } } } }