RackUnit_1220

来源:互联网 发布:大数据营销培训课程 编辑:程序博客网 时间:2024/06/13 12:42

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Windows.Media.Imaging;
using GDev.PopupBox;

namespace ComputerDropDragControl
{
    /// <summary>
    /// “机架”单元
    /// 创建人:吴兆娟
    /// 创建时间:2011-10-26
    /// </summary>
    public partial class RackUnit : UserControl
    {
        #region <<页面加载>>

        /// <summary>
        /// 页面加载事件
        /// </summary>
        public RackUnit(RowFrameView entity)
        {
            InitializeComponent();

            FrameMsg = entity;

            //加载控件
            LoadControl();
        }

        #endregion

        #region <<控件事件>>

        #region <<拖拽相关事件>>

        /// <summary>
        /// “开始拖拽”
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dropDragPanel_ItemDragStarting(object sender, ItemDragEventArgs e)
        {
            StaticClass.FromList = false;
            //2011-12-08修改
            StaticClass.FromHandCar = false;

            StaticClass.DragPanel = (PanelDragDropTarget)sender;
            //2011-12-15修改,具体修改的原因见DroppedOnTarget事件中的描述
            StaticClass.DrogPanelList = null;
            StaticClass.DropPanel = null;

            Dictionary<string, object> dic = GetDropDragPanelContentValues(StaticClass.DragPanel);

            StackPanel stackContent = (StackPanel)(StaticClass.DragPanel.Content);
            CU = (ComputerUnit)(stackContent.Children[3]);
            CU.ShowTip = false;

            NodeFrameView entity = new NodeFrameView(CU.ReturnNodeFrameView.NodeID, CU.ReturnNodeFrameView.NodeName,
                CU.ReturnNodeFrameView.NodeSize, CU.ReturnNodeFrameView.NodeBeginUNo, CU.ReturnNodeFrameView.NodeEndUNo,
                CU.ReturnNodeFrameView.FrameID);
            StaticClass.CUStatic = new ComputerUnit(entity);
        }

        /// <summary>
        /// “目标”即是“放”的对象Drop事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dropDragPanel_Drop(object sender, Microsoft.Windows.DragEventArgs e)
        {
            StaticClass.DropInHandCar = false;

            //“放”
            StaticClass.DropPanel = (PanelDragDropTarget)sender;
            DropPanel = (PanelDragDropTarget)sender;
            Dictionary<string, object> dicDrop = GetDropDragPanelContentValues((PanelDragDropTarget)sender);

            //“放”对象的父对象
            Grid fatherDropGrid = ((Grid)((PanelDragDropTarget)sender).Parent);
            int tempDropCount = (fatherDropGrid.Children.Count() + 1) / 2;
            PanelDragDropTarget dropPanelEnd = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"]) * 2];
            StackPanel stackDropEnd = (StackPanel)dropPanelEnd.Content;
            TextBlock tbDropFrame = (TextBlock)stackDropEnd.Children[0];

            //2011-12-08修改
            #region <<“普通情况”>>
            if (!StaticClass.FromList)
            {
                bool normalCondition = true;

                //“拖”
                StackPanel stackContent = (StackPanel)(StaticClass.DragPanel.Content);
                CU = (ComputerUnit)(stackContent.Children[3]);
                Dictionary<string, object> dicDrag = GetDropDragPanelContentValues(StaticClass.DragPanel);

                //“拖”
                Grid fatherDragGrid = (Grid)(StaticClass.DragPanel.Parent);
                int tempDragCount = (fatherDragGrid.Children.Count() + 1) / 2;
                StackPanel stackDragEnd = (StackPanel)StaticClass.DragPanel.Content;
                TextBlock tbDragFrame = (TextBlock)stackDragEnd.Children[0];
                TextBlock tbDragUNo = (TextBlock)stackDragEnd.Children[1];
                TextBlock tbExist = (TextBlock)stackDragEnd.Children[2];

                if (tbDropFrame.Text == tbDragFrame.Text)//同一个机器架内拖拽的业务逻辑
                {
                    List<PanelDragDropTarget> listNeighborUp = new List<PanelDragDropTarget>();
                    for (int i = 1; i < CU.ReturnNodeFrameView.NodeSize; i++)
                    {
                        if ((tempDropCount - (int)dicDrag["RackUNo"] - i) * 2 > 2)//2011-12-07修改
                        {
                            PanelDragDropTarget panelTemp = (PanelDragDropTarget)fatherDragGrid.Children[(tempDropCount - (int)dicDrag["RackUNo"] - i) * 2];
                            StackPanel stackTemp = (StackPanel)panelTemp.Content;
                            TextBlock tbExistTemp = (TextBlock)stackTemp.Children[2];
                            TextBlock tbRackUNo = (TextBlock)stackTemp.Children[1];
                            if (tbExistTemp.Text == "false")
                            {
                                listNeighborUp.Add(panelTemp);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    foreach (PanelDragDropTarget panel in listNeighborUp)
                    {
                        if (panel == DropPanel)
                        {
                            normalCondition = false;
                            //MessageBox.Show("特殊的拆分模式!");

                            //2011-12-20修改
                            DepartUnit(StaticClass.DragPanel, dicDrag);
                            MergeUnit(StaticClass.DragPanel, dicDrop);
                            StaticClass.ExistPlace = true;

                            //2011-12-20修改
                            //UpdateData();
                            //UpdateCurrentCU();
                            return;
                        }
                    }
                }
                if (normalCondition)
                {
                    //是否存在存储空间以及操作
                    WhetherExistPlace();
                }
            }
            #endregion

            #region <<“手推车”以及“查询未上架设备”>>
            else
            {
                ListBox list = (ListBox)StaticClass.DragPanelList.Content;
                ListBoxItem selectItem = (ListBoxItem)list.SelectedItem;
                SelectItem = selectItem;
                SelectIndex = list.SelectedIndex;

                //2011-12-08修改
                //在是“查询未上架的设备”的时候,并不能确定设备的NodeSize。所以呢,不能生成设备
                if (StaticClass.FromHandCar)
                {
                    //2011-12-08修改
                    //至于为什么要在Drop的时候就生成了CU,是可以用也可以不用,但是这样整个代码操作比较的统一,
                    NodeFrameView entity = (NodeFrameView)selectItem.DataContext;
                    ComputerUnit cu = new ComputerUnit(entity);
                    cu.ShowTip = true;
                    CU = cu;
                }

                //是否存在存储空间以及操作
                WhetherExistPlace();
            }
            #endregion
        }

        /// <summary>
        /// “拖对象放至目标对象后”发生的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dropDragPanel_ItemDroppedOnTarget(object sender, ItemDragEventArgs e)
        {
            if (StaticClass.DropInHandCar)//置入“手推车”
            {
                //2011-12-15修改,因为有这样的操作步骤,先是移入手推车,再是没有把设备没有移入任何
                //一个DropPanel中,但是呢此时StaticClass.DropInHandCar的值为true,也就进入了方法体,于是有不想看到的错误。
                if (StaticClass.DrogPanelList != null)
                {
                    //2011-12-20修改                  
                    //拖
                    Dictionary<string, object> dicDrag = GetDropDragPanelContentValues(StaticClass.DragPanel);

                    DepartUnit(StaticClass.DragPanel, dicDrag);

                    ListBoxDragDropTarget listDropPanel = (ListBoxDragDropTarget)StaticClass.DrogPanelList;
                    ListBox lb = (ListBox)listDropPanel.Content;
                    int count = lb.Items.Count;
                    lb.Items.Remove(CU);

                    //2011-12-15修改
                    StaticClass.HandCarList.Add(CU.ReturnNodeFrameView.NodeID);
                    //StaticClass.DropInHandCar = false;//2011-12-08修改
                }
            }
            else if (StaticClass.DropInRecyle)//置入“回收站”
            {
                //2011-12-15修改,因为有这样的操作步骤,先是移入手推车,再是没有把设备没有移入任何
                //一个DropPanel中,但是呢此时StaticClass.DropInHandCar的值为true,也就进入了方法体,于是有不想看到的错误。
                //遇上面的置入“手推车”是同样的道理
                if (StaticClass.DrogPanelList != null)
                {
                    //拖
                    Dictionary<string, object> dicDrag = GetDropDragPanelContentValues(StaticClass.DragPanel);

                    DepartUnit(StaticClass.DragPanel, dicDrag);

                    ListBoxDragDropTarget listDropPanel = (ListBoxDragDropTarget)StaticClass.DrogPanelList;
                    ListBox lb = (ListBox)listDropPanel.Content;
                    int count = lb.Items.Count;
                    lb.Items.RemoveAt(count - 1);

                    //StaticClass.DropInRecyle = false;//2011-12-08修改
                }
            }
            else//“普通”情况
            {
                //存在这样的情况,先是移入U中,此时StaticClass.DropPanel不为NULL,进入,其实这样写最后结果是对了,但是有点不规范以及
                //顺理成章
                if (StaticClass.DropPanel != null)
                {
                    #region
                    //2011-12-20修改
                    //现在Drop事件中,只判断是否存在空间,不做Merge以及Depart的操作
                    //在updateData成功后才做操作
                    //也就是DropPanel在不存在空间ExistPlace=false时AllowDrop=true;
                    //DropPanel在存在空间ExistPlace=true时【原来Merge后AllowDrop=false】,【现在不进行Merge,AllowDrop=true;】
                    //对于DropPanel中原先AllowDrop=false的,首先DropPanel是为null的,再者AllowDrop=false;
                    #endregion
                    if (StaticClass.DropPanel.AllowDrop)//“不存在空间”的话,没有进行Merge以及Depart的操作,所以AllowDrop=true;
                    //这句可有可无,其实貌似不写比较的规范
                    {
                        if (!StaticClass.ExistPlace)//不存在空间
                        {
                            CancelBehavior();
                        }
                    }
                    else
                    {
                        #region <<2011-12-20修改,存在空间>>
                        UpdateData();
                        #endregion
                    }
                }
                CU.ShowTip = true;
            }
        }

        #endregion

        /// <summary>
        /// “模态窗口关闭”时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cr_Closed(object sender, EventArgs e)
        {
            CWInRack cr = (CWInRack)sender;

            if (StaticClass.DropPanel != null)
            {
                if (!StaticClass.DropPanel.AllowDrop)
                {
                    //2011-12-08修改
                    //修改原因:已经在DroppedOnTarget事件中处理了
                    //((StackPanel)StaticClass.DropPanel.Content).Children.Remove(SelectItem);//模态窗口发生关闭的时候移除了SelectITem

                    if (cr.DialogResult == false)
                    {
                        //拆分单元格
                        //DepartUnit(StaticClass.DropPanel);

                        ((StackPanel)StaticClass.DropPanel.Content).Children.RemoveAt(3);
                        StaticClass.DropPanel.AllowDrop = true;

                        ListBox list = (ListBox)StaticClass.DragPanelList.Content;
                        list.Items.Insert(SelectIndex, SelectItem);

                    }

                    if (cr.DialogResult == true)//Drop的时候“设备已经被移走了”。
                    {
                        //if (StaticClass.FromHandCar)
                        //{
                        //    foreach (ListBoxItem item in StaticClass.HandCarList)//“手推车”
                        //    {
                        //        if (item.Name == SelectItem.Name)
                        //        {
                        //            StaticClass.HandCarList.Remove(item);
                        //            return;
                        //        }
                        //    }
                        //}

                        //数据库交互
                    }

                    StaticClass.FromHandCar = false;
                }
            }
        }

        #endregion

        #region <<辅助方法>>

        /// <summary>
        /// 打开模态窗口
        /// </summary>
        private void OpenChildWindow()
        {
            CWInRack cr = new CWInRack();
            cr.OverlayOpacity = 0.1;
            cr.Height = 300;
            cr.Width = 500;
            //cr.Content = tempFrame;
            try
            {
                cr.Show();
            }
            catch (Exception ex)
            {

            }


            cr.Closed += new EventHandler(cr_Closed);
        }

        /// <summary>
        /// 更新数据库
        /// </summary>
        private void UpdateData()
        {
            //2011-12-20修改
            #region <<数据库交互>>
            //2011-12-20修改
            //StackPanel stackDrop = (StackPanel)DropPanel.Content;
            StackPanel stackDrop = (StackPanel)StaticClass.DropPanel.Content;
            NodeFrameView entity = new NodeFrameView(CU.ReturnNodeFrameView.NodeID,
                CU.ReturnNodeFrameView.NodeName, CU.ReturnNodeFrameView.NodeSize,
                int.Parse(((TextBlock)stackDrop.Children[1]).Text) - CU.ReturnNodeFrameView.NodeSize + 1,
                int.Parse(((TextBlock)stackDrop.Children[1]).Text), ((TextBlock)stackDrop.Children[0]).Text);

            isSuccess = true;
            MessageBox.Show("上架成功d");
            #endregion

            #region
            //StackPanel stackDrop = (StackPanel)DropPanel.Content;
            //CU.ReturnNodeFrameView.FrameID = ((TextBlock)stackDrop.Children[0]).Text;
            //CU.ReturnNodeFrameView.NodeEndUNo = int.Parse(((TextBlock)stackDrop.Children[1]).Text);
            //CU.ReturnNodeFrameView.NodeBeginUNo = int.Parse(((TextBlock)stackDrop.Children[1]).Text) - CU.ReturnNodeFrameView.NodeSize + 1;

            //建立“设备”和“机架”新关系
            //MessageBox.Show(CU.ReturnNodeFrameView.FrameID + "------" + CU.ReturnNodeFrameView.NodeBeginUNo.ToString() + "-------" + CU.ReturnNodeFrameView.NodeEndUNo.ToString());
            #endregion

            #region <<2011-12-20修改>>
            if (isSuccess)
            {
                #region
                //#region <<Drop对象>>
                ////“放”
                //StaticClass.DropPanel = (PanelDragDropTarget)sender;
                //DropPanel = (PanelDragDropTarget)sender;
                //Dictionary<string, object> dicDrop = GetDropDragPanelContentValues((PanelDragDropTarget)sender);

                ////“放”对象的父对象
                //Grid fatherDropGrid = ((Grid)((PanelDragDropTarget)sender).Parent);
                //int tempDropCount = (fatherDropGrid.Children.Count() + 1) / 2;
                //PanelDragDropTarget dropPanelEnd = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"]) * 2];
                //StackPanel stackDropEnd = (StackPanel)dropPanelEnd.Content;
                //TextBlock tbDropFrame = (TextBlock)stackDropEnd.Children[0];
                //#endregion

                //MergeUnit(DropPanel, dicDrop);

                //if (!StaticClass.FromHandCar)//“普通情况”
                //{
                //    DepartUnit(StaticClass.DragPanel);
                //}
                //else//来自“手推车”
                //{
                //    stackDropEnd.Children.Add(CU);
                //}

                //UpdateCurrentCU();
                #endregion

                UpdateCurrentCU();
            }
            else
            {
                //拖
                Dictionary<string, object> dicDrag = GetDropDragPanelContentValues(StaticClass.DragPanel);

                //“放”
                Dictionary<string, object> dicDrop = GetDropDragPanelContentValues(StaticClass.DropPanel);

                //2011-12-20修改
                //这边注意下“拆分”与“合并”的顺序问题,
                //因为若是先合并,在拆分,两个方法有重叠的地方,也就是对于其中一个DropPanel,先是Collapsed后是Visible,导致设备
                //显示的时候被遮挡,若是先拆分,再是合并的话就能避免这样的问题。
                DepartUnit(StaticClass.DropPanel, dicDrop);//拆分“放”

                MergeUnit(StaticClass.DragPanel, dicDrag);//合并“拖”

                CancelBehavior();

                MessageBox.Show("需要Depart和Merge");
            }
            #endregion

        }

        //2011-12-14修改
        /// <summary>
        /// 更新“移动设备”中ReturnNideFrameView信息
        /// </summary>
        private void UpdateCurrentCU()
        {
            StackPanel stackDrop = (StackPanel)DropPanel.Content;
            CU.ReturnNodeFrameView.FrameID = ((TextBlock)stackDrop.Children[0]).Text;
            CU.ReturnNodeFrameView.NodeEndUNo = int.Parse(((TextBlock)stackDrop.Children[1]).Text);
            CU.ReturnNodeFrameView.NodeBeginUNo = int.Parse(((TextBlock)stackDrop.Children[1]).Text) - CU.ReturnNodeFrameView.NodeSize + 1;
        }


        /// <summary>
        /// 判断是否存在存储空间以及相关操作
        /// </summary>
        private void WhetherExistPlace()
        {
            try
            {
                //“放”
                Dictionary<string, object> dicDrop = GetDropDragPanelContentValues(DropPanel);

                //“拖”
                Dictionary<string, object> dicDrag = GetDropDragPanelContentValues(StaticClass.DragPanel);

                Grid fatherDropGrid = (Grid)(DropPanel.Parent);
                int tempDropCount = (fatherDropGrid.Children.Count() + 1) / 2;
                PanelDragDropTarget dropPanelEnd = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"]) * 2];
                StackPanel stackDropEnd = (StackPanel)dropPanelEnd.Content;
                TextBlock tbDropFrame = (TextBlock)stackDropEnd.Children[0];

                #region <<判断是否有足够空间>>

                #region <<普通情况+手推车,知道NodeSize,未上架的设备是不知道NodeSize的>>

                if (!StaticClass.FromList || StaticClass.FromHandCar) //2011-12-08修改
                {
                    if (CU.ReturnNodeFrameView.NodeSize == 1)
                    {
                        if (((TextBlock)stackDropEnd.Children[2]).Text == "true")
                        {
                            MessageBox.Show("没有足够的空间!");
                            StaticClass.ExistPlace = false;
                            return;
                        }
                        else
                        {
                            StaticClass.ExistPlace = true;

                            #region <<2011-12-20修改>>
                            MergeUnit(DropPanel, dicDrop);

                            if (!StaticClass.FromHandCar)//“普通情况”
                            {
                                DepartUnit(StaticClass.DragPanel, dicDrag);
                            }
                            else//来自“手推车”
                            {
                                stackDropEnd.Children.Add(CU);
                            }

                            //UpdateData();

                            //UpdateCurrentCU();
                            #endregion
                        }
                    }
                    else
                    {
                        for (int i = 1; i < CU.ReturnNodeFrameView.NodeSize; i++)
                        {
                            //2011-12-08
                            //循环的次数是NodeSize-1次
                            //1.检验Drop向下的Drop是否存在,
                            //2.(tempDropCount - (int)dicDrop["RackUNo"] + i) * 2 代表Drop下i个Drop是否存在,
                            //tempDropCount * 2 - 1代表Drop所在Grid总共的Children个数
                            //3.若是还在循环内,Drop下没有越界的Drop中有设备,则不存在存储空间
                            //4.越界的话就不进入进行判断;
                            if ((tempDropCount - (int)dicDrop["RackUNo"] + i) * 2 <= tempDropCount * 2 - 1)
                            {
                                PanelDragDropTarget dropPanelTempOne = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"] + i) * 2];
                                StackPanel stackDropPanelOne = (StackPanel)dropPanelTempOne.Content;
                                TextBlock tbExistComputer = (TextBlock)stackDropPanelOne.Children[2];
                                if (tbExistComputer.Text == "true")
                                {
                                    MessageBox.Show("没有足够的空间!");
                                    StaticClass.ExistPlace = false;
                                    return;
                                }
                            }
                            #region <<可以进行优化的算法 2011-12-08>>
                            else
                            {
                                MessageBox.Show("没有足够的空间!");
                                StaticClass.ExistPlace = false;
                                return;
                            }
                            #endregion

                            //下面的代码是循环至最后,首先判断(tempDropCount - (int)dicDrop["RackUNo"] + i) * 2代表最后一个Drop是
                            //Drop所在Grid的第几个Children,
                            //tempDropCount * 2 - 1是表示Drop所在的Grid总共的Children的个数,
                            //1.先判断是否越界,越界的话肯定
                            if (i == CU.ReturnNodeFrameView.NodeSize - 1)
                            {
                                #region
                                //if ((tempDropCount - (int)dicDrop["RackUNo"] + i) * 2 > tempDropCount * 2 - 1)
                                //{
                                //    MessageBox.Show("没有足够的空间!");
                                //    StaticClass.ExistPlace = false;
                                //    return;
                                //}
                                //else
                                //{
                                #endregion

                                if ((tempDropCount - (int)dicDrop["RackUNo"] + i) * 2 <= tempDropCount * 2 - 1)//再保险下
                                {
                                    StaticClass.ExistPlace = true;

                                    #region <<2011-12-20修改>>
                                    //合并单元格
                                    MergeUnit(DropPanel, dicDrop);

                                    //2011-12-08修改
                                    //if (!StaticClass.FromList)
                                    //{
                                    if (!StaticClass.FromHandCar)
                                    {
                                        //拆分单元格
                                        DepartUnit(StaticClass.DragPanel, dicDrag);
                                    }
                                    else
                                    {
                                        stackDropEnd.Children.Add(CU);
                                    }

                                    #region
                                    //}
                                    //else
                                    //{
                                    //    stackDropEnd.Children.Add(CU);

                                    //    if (!StaticClass.FromHandCar)//2011-12-07添加,
                                    //    {
                                    //        //打开模态窗口填写信息
                                    //        //OpenChildWindow();

                                    //        ShowOnFrameWindow();
                                    //    }
                                    //}

                                    //2011-12-14修改
                                    ////数据库操作
                                    //UpdateData();

                                    //2011-12-08修改
                                    //StaticClass.FromList = false;
                                    //StaticClass.FromHandCar = false;//2011-12-07添加
                                    #endregion

                                    //UpdateData();
                                    //UpdateCurrentCU();
                                    #endregion
                                }
                            }
                        }
                    }
                }
                #endregion

                //2011-12-08 修改
                #region <<来自“查询未上架设备”>>
                else
                {
                    //获取目标Drop下连续的没有设备的U单位的个数
                    CheckExistUCount();

                    ShowOnFrameWindow();
                    //MessageBox.Show("未上架设备");
                }
                #endregion

                #endregion

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #region <<上架相关 2011-12-08>>

        private int ExistUCount = 1;

        /// <summary>
        /// 获取目标Drop下连续的没有设备的U单位的个数
        /// 2011-12-08修改
        /// </summary>
        private void CheckExistUCount()
        {
            //“放”
            Dictionary<string, object> dicDrop = GetDropDragPanelContentValues(DropPanel);

            Grid fatherDropGrid = (Grid)(DropPanel.Parent);
            int tempDropCount = (fatherDropGrid.Children.Count() + 1) / 2;
            PanelDragDropTarget dropPanelEnd = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"]) * 2];
            StackPanel stackDropEnd = (StackPanel)dropPanelEnd.Content;
            TextBlock tbDropFrame = (TextBlock)stackDropEnd.Children[0];

            for (int i = 1; ; i++)//循环无数次,遇到一定的条件后退出
            {
                if ((tempDropCount - (int)dicDrop["RackUNo"] + i) * 2 <= tempDropCount * 2 - 1)//不越界
                {
                    PanelDragDropTarget dropPanelTempOne = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"] + i) * 2];
                    StackPanel stackDropPanelOne = (StackPanel)dropPanelTempOne.Content;
                    TextBlock tbExistComputer = (TextBlock)stackDropPanelOne.Children[2];
                    if (tbExistComputer.Text == "false")//不存在设备
                    {
                        ExistUCount = ExistUCount + 1;
                    }
                    else//存在设备
                    {
                        return;
                    }
                }
                else//越界
                {
                    return;
                }
            }
        }


        /// <summary>
        /// “上架”
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ShowOnFrameWindow()
        {
            //弹出“模态信息”窗口
            PopupService service = PopupService.GetServiceFor((Grid)StaticClass.UIRoot);
            MessagePageOnFrame box = service.GetMessagePageOnFrame(
               "上架",
                new OnFrameContent(),
               "上架",
               true,
               (MessageBoxButtonType)Enum.Parse(
               typeof(MessageBoxButtonType),
               "YesNo",
               true),
               null,

               SelectItem.Content.ToString(),
               ExistUCount,
               StaticClass.DragPanelList,
               StaticClass.DropPanel
           );
            box.Effect = GDev.PopupBox.Effect.NoEffect(box);
            box.ShowComplete += new EventHandler(Box_ShowComplete);
            box.ButtonClick += new EventHandler(Box_ButtonClick);
            box.ShowAsModal();
        }

        //2011-12-08
        private void Box_ButtonClick(object sender, EventArgs e)
        {
            //“放”
            Dictionary<string, object> dicDrop = GetDropDragPanelContentValues(DropPanel);

            MessagePageOnFrame mp = (MessagePageOnFrame)sender;

            //页面保存时进行的是数据库中操作,返回了“成功”以及“不成功”的情况
            //之后进行的就是界面的添加“设备的操作”
            //上架成功,生成设备
            if (((MessagePageOnFrame)sender).Result == MessageBoxButtonResult.Yes)
            {
                NodeFrameView nv = new NodeFrameView("", SelectItem.Content.ToString(), mp.ComputerEntity.NodeSize,
                mp.ComputerEntity.NodeBeginUNo, mp.ComputerEntity.NodeEndUNo, mp.ComputerEntity.FrameID);

                ComputerUnit cu = new ComputerUnit(nv);
                cu.ShowTip = true;
                CU = cu;

                StackPanel stackDrop = (StackPanel)DropPanel.Content;
                stackDrop.Children.Add(CU);

                //合并单元格
                MergeUnit(DropPanel, dicDrop);

                //2011-12-14修改
                //貌似在创建设备的时候已经对ReturnFrameView的值进行了赋值,不需要在进行数据库交互了。
                ////数据交互
                //UpdateData();
            }

            //上架失败后的取消或是关闭,不生成设备,并且向DragList中添加原来的项
            if (((MessagePageOnFrame)sender).Result == MessageBoxButtonResult.No)
            {
                ListBox list = (ListBox)StaticClass.DragPanelList.Content;
                list.Items.Insert(SelectIndex, SelectItem);
                ((MessagePageOnFrame)sender).Close();
            }
        }

        private void Box_ShowComplete(object sender, EventArgs e)
        {
            //MessageText.Text = "打开了新窗口";
        }

        #endregion

        /// <summary>
        /// “合并单元格”
        /// </summary>
        /// <param name="panel"></param>
        private void MergeUnit(PanelDragDropTarget panel, Dictionary<string, object> dicDrop)
        {
            Grid fatherDropGrid = (Grid)(panel.Parent);
            int tempDropCount = (fatherDropGrid.Children.Count() + 1) / 2;
            PanelDragDropTarget dropPanelEnd = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"]) * 2];
            dropPanelEnd.AllowDrop = false;
            dropPanelEnd.SetValue(Grid.RowSpanProperty, CU.ReturnNodeFrameView.NodeSize);
            StackPanel stackDropEnd = (StackPanel)dropPanelEnd.Content;
            stackDropEnd.Height = 40 * CU.ReturnNodeFrameView.NodeSize;
            TextBlock tbDropFrame = (TextBlock)stackDropEnd.Children[0];

            for (int j = 1; j < CU.ReturnNodeFrameView.NodeSize; j++)
            {
                PanelDragDropTarget dropPanelTemp = (PanelDragDropTarget)fatherDropGrid.Children[(tempDropCount - (int)dicDrop["RackUNo"] + j) * 2];
                dropPanelTemp.Visibility = Visibility.Collapsed;
                dropPanelTemp.AllowDrop = false;

                StackPanel stackTemp = (StackPanel)dropPanelTemp.Content;
                ((TextBlock)stackTemp.Children[2]).Text = "true";
            }

            #region <<修改偷藏值>>

            ((TextBlock)stackDropEnd.Children[2]).Text = "true";

            #endregion
        }

        /// <summary>
        /// 2011-12-20修改
        /// “拆分单元格”
        /// </summary>
        /// <param name="panel"></param>
        private void DepartUnit(PanelDragDropTarget panel, Dictionary<string, object> dicDrag)
        {
            //“拖”的父对象
            Grid fatherDragGrid = (Grid)(panel.Parent);

            int tempCount = (fatherDragGrid.Children.Count() + 1) / 2;
            //2011-12-20修改
            //PanelDragDropTarget dragPanelEnd = (PanelDragDropTarget)fatherDragGrid.Children[(tempCount - CU.ReturnNodeFrameView.NodeEndUNo) * 2];
            PanelDragDropTarget dragPanelEnd = (PanelDragDropTarget)fatherDragGrid.Children[(tempCount - (int)dicDrag["RackUNo"]) * 2];
            dragPanelEnd.AllowDrop = true;
            dragPanelEnd.SetValue(Grid.RowSpanProperty, 1);
            StackPanel stackDragEnd = (StackPanel)dragPanelEnd.Content;
            stackDragEnd.Height = 40;//单位长度        

            for (int i = 1; i < CU.ReturnNodeFrameView.NodeSize; i++)
            {
                //2011-12-20修改
                //PanelDragDropTarget dropDragPanelTemp =
                //    (PanelDragDropTarget)fatherDragGrid.Children[(tempCount - CU.ReturnNodeFrameView.NodeEndUNo + i) * 2];
                PanelDragDropTarget dropDragPanelTemp =
                    (PanelDragDropTarget)fatherDragGrid.Children[(tempCount - (int)dicDrag["RackUNo"] + i) * 2];
                dropDragPanelTemp.Visibility = Visibility.Visible;
                dropDragPanelTemp.AllowDrop = true;

                StackPanel stackTemp = (StackPanel)dropDragPanelTemp.Content;
                ((TextBlock)stackTemp.Children[2]).Text = "false";
            }

            #region <<修改偷藏值>>

            ((TextBlock)stackDragEnd.Children[2]).Text = "false";

            #endregion
        }

        /// <summary>
        /// “取消拖拽操作”
        /// </summary>
        private void CancelBehavior()
        {
            ((StackPanel)StaticClass.DropPanel.Content).Children.RemoveAt(3);
            ((StackPanel)StaticClass.DragPanel.Content).Children.Add(CU);
            StaticClass.DropPanel.AllowDrop = true;
            StaticClass.DragPanel.AllowDrop = false;
        }

        /// <summary>
        /// 获取DropDragPanel中值信息
        /// </summary>
        /// <param name="panel"></param>
        /// <returns></returns>
        private Dictionary<string, object> GetDropDragPanelContentValues(PanelDragDropTarget panel)
        {
            Dictionary<string, object> dic = new Dictionary<string, object>();
            StackPanel aimStack = (StackPanel)panel.Content;

            #region<<偷藏的一些设备以及机架信息赋值>>

            string computerFrame = ((TextBlock)aimStack.Children[0]).Text;

            int rackUNo = int.Parse(((TextBlock)aimStack.Children[1]).Text);

            string existComputer = ((TextBlock)aimStack.Children[2]).Text;

            #endregion

            dic.Add("FrameID", computerFrame);
            dic.Add("RackUNo", rackUNo);
            dic.Add("ExistComputer", existComputer);

            return dic;
        }


        #region <<加载界面相关>>

        /// <summary>
        /// 加载控件
        /// </summary>
        private void LoadControl()
        {
            ColumnDefinition c1 = new ColumnDefinition();
            c1.Width = new GridLength(40);
            ColumnDefinition c2 = new ColumnDefinition();
            c2.Width = new GridLength(1);
            ColumnDefinition c3 = new ColumnDefinition();
            c3.Width = new GridLength(90);
            LayoutRoot.ColumnDefinitions.Add(c1);
            LayoutRoot.ColumnDefinitions.Add(c2);
            LayoutRoot.ColumnDefinitions.Add(c3);
            LayoutRoot.Width = 131;
            LayoutRoot.HorizontalAlignment = HorizontalAlignment.Left;
            LayoutRoot.ShowGridLines = false;
            LayoutRoot.Height = 23 * (FrameMsg.TotalUCount + 1) + 5;
            borderOne.Height = 23 * (FrameMsg.TotalUCount + 1) + 5;
            recOne.Height = 23 * (FrameMsg.TotalUCount + 1) - 5;
            recOne.Width = 131;

            for (int i = FrameMsg.TotalUCount + 2; i >= 1; i--)
            {
                RowDefinition rd = new RowDefinition();
                rd.Height = new GridLength(23);
                LayoutRoot.RowDefinitions.Add(rd);

                if (i == FrameMsg.TotalUCount + 2)//“头”
                {
                    //StackPanel stackHeader = new StackPanel();
                    //stackHeader.Background = new SolidColorBrush(Color.FromArgb(255, 56, 55, 55));
                    #region
                    //LinearGradientBrush header = new LinearGradientBrush();
                    //header.StartPoint = new Point(0, 0);
                    //header.EndPoint = new Point(0, 1);
                    //GradientStopCollection headStopCol = new GradientStopCollection();
                    //GradientStop gsOne = new GradientStop();
                    //gsOne.Color = Color.FromArgb(255, 134, 134, 134);
                    //gsOne.Offset = 0;
                    //GradientStop gsTwo = new GradientStop();
                    //gsTwo.Color = Color.FromArgb(255, 134, 134, 134);
                    //gsTwo.Offset = 0.5;
                    //GradientStop gsThree = new GradientStop();
                    //gsThree.Color = Color.FromArgb(255, 89, 89, 89);
                    //gsThree.Offset = 0.5;
                    //GradientStop gsFour = new GradientStop();
                    //gsFour.Color = Color.FromArgb(255, 89, 89, 89);
                    //gsFour.Offset = 1;
                    //headStopCol.Add(gsOne);
                    //headStopCol.Add(gsTwo);
                    //headStopCol.Add(gsThree);
                    //headStopCol.Add(gsFour);
                    //header.GradientStops = headStopCol;
                    //stackHeader.Background = header;
                    #endregion

                    //stackHeader.SetValue(Grid.RowProperty, 0);
                    //stackHeader.SetValue(Grid.ColumnSpanProperty, 3);
                    //stackHeader.Height = 33;

                    //TextBlock tbHeader = new TextBlock();
                    //tbHeader.Text = FrameMsg.FrameName;
                    //tbHeader.Foreground = new SolidColorBrush(Colors.White);
                    //tbHeader.TextAlignment = TextAlignment.Center;

                    //tbHeader.VerticalAlignment = VerticalAlignment.Center;
                    //tbHeader.SetValue(Grid.RowProperty, 0);
                    //tbHeader.SetValue(Grid.ColumnSpanProperty, 3);
                    //LayoutRoot.Children.Add(tbHeader);
                    //tbHeader.Margin = new Thickness(0, 5, 0, 0);
                    //stackHeader.Children.Add(tbHeader);

                    rd.Height = new GridLength(28);
                    Button btnHead = new Button();
                    btnHead.Content = FrameMsg.FrameName;
                    btnHead.SetValue(Grid.RowProperty, 0);
                    btnHead.SetValue(Grid.ColumnSpanProperty, 3);
                    LayoutRoot.Children.Add(btnHead);

                }
                else if (i == FrameMsg.TotalUCount + 1)//“横间隔”以及“竖间隔”
                {
                    rd.Height = new GridLength(1);

                    Border borderSeperateH = new Border();
                    borderSeperateH.SetValue(Grid.RowProperty, 1);
                    borderSeperateH.SetValue(Grid.ColumnSpanProperty, 3);
                    borderSeperateH.Background = new SolidColorBrush(Colors.Black);
                    LayoutRoot.Children.Add(borderSeperateH);

                    Border borderSeperateV = new Border();
                    borderSeperateV.SetValue(Grid.RowProperty, 2);
                    borderSeperateV.SetValue(Grid.ColumnProperty, 1);
                    borderSeperateV.Background = new SolidColorBrush(Colors.Black);
                    borderSeperateV.SetValue(Grid.RowSpanProperty, FrameMsg.TotalUCount);//跨行操作
                    LayoutRoot.Children.Add(borderSeperateV);

                }
                else//2011-12-14修改,加载“电源”“KVM”,其中比较特殊的是“设备”,不作为Frame机架的属性进行绑定,
                //特殊的是“电源”“KVM”作为了机架的属性在此进行加载。
                {
                    StackPanel stackUNo = new StackPanel();
                    stackUNo.SetValue(Grid.RowProperty, FrameMsg.TotalUCount - i + 2);//第一行:表头,第二行:间隔,第三行:编号开始了1
                    stackUNo.SetValue(Grid.ColumnProperty, 0);

                    TextBlock tbRackNum = new TextBlock();
                    tbRackNum.Text = i.ToString();
                    tbRackNum.Foreground = new SolidColorBrush(Colors.Black);
                    tbRackNum.TextAlignment = TextAlignment.Center;
                    //tbRackNum.VerticalAlignment = VerticalAlignment.Center;
                    //tbRackNum.SetValue(Grid.RowProperty, FrameMsg.TotalUCount - i + 2);
                    //tbRackNum.SetValue(Grid.ColumnProperty, 0);
                    //LayoutRoot.Children.Add(tbRackNum);
                    tbRackNum.Margin = new Thickness(0, 5, 0, 0);
                    stackUNo.Children.Add(tbRackNum);
                    LayoutRoot.Children.Add(stackUNo);

                    PanelDragDropTarget dropDrapPanel = new PanelDragDropTarget();
                    dropDrapPanel.AllowDrop = true;
                    dropDrapPanel.SetValue(Grid.RowProperty, FrameMsg.TotalUCount - i + 2);
                    dropDrapPanel.SetValue(Grid.ColumnProperty, 2);

                    StackPanel stackOne = new StackPanel();
                    stackOne.Height = 23;
                    stackOne.Width = 90;
                    if ((i - 1) % 2 == 0)
                    {
                        //stackUNo.Background = new SolidColorBrush(Color.FromArgb(255, 204, 222, 237));
                        stackOne.Background = new SolidColorBrush(Colors.LightGray);
                    }
                    else
                    {
                        //stackUNo.Background = new SolidColorBrush(Colors.White);
                        stackOne.Background = new SolidColorBrush(Colors.White);
                    }

                    #region<<偷藏的一些设备以及机架信息>>

                    TextBlock hidFrameID = new TextBlock();//设备所在机架FrameID
                    hidFrameID.Visibility = Visibility.Collapsed;
                    hidFrameID.Text = FrameMsg.FrameID;//2011-12-08修改

                    TextBlock hidUNo = new TextBlock();//机架U单位编号
                    hidUNo.Visibility = Visibility.Collapsed;
                    hidUNo.Text = tbRackNum.Text;

                    TextBlock hidExistComputer = new TextBlock();//机架U中是否存在设备
                    hidExistComputer.Visibility = Visibility.Collapsed;
                    hidExistComputer.Text = "false";

                    stackOne.Children.Add(hidFrameID);
                    stackOne.Children.Add(hidUNo);
                    stackOne.Children.Add(hidExistComputer);

                    #endregion

                    dropDrapPanel.Content = stackOne;

                    #region <<订阅拖拽事件>>

                    dropDrapPanel.ItemDroppedOnTarget += new EventHandler<ItemDragEventArgs>(dropDragPanel_ItemDroppedOnTarget);

                    dropDrapPanel.Drop += new Microsoft.Windows.DragEventHandler(dropDragPanel_Drop);

                    dropDrapPanel.ItemDragStarting += new EventHandler<ItemDragEventArgs>(dropDragPanel_ItemDragStarting);

                    #endregion

                    #region <<2011-12-14修改>>

                    #region <<电源个数是1的时候>>
                    if (FrameMsg.ElectricNo == 1)//表示“有电源的存在”
                    {
                        if (i == FrameMsg.TotalUCount)//“只在第二行的时候进行设置,其余时候不管的哦”
                        {
                            //Image electricImg = new Image();
                            //electricImg.Width = 90;
                            //electricImg.Height = 23 * FrameMsg.ElectricCount;
                            //electricImg.VerticalAlignment = VerticalAlignment.Top;
                            //electricImg.Source = new BitmapImage(new Uri("Img/Electric.png", UriKind.Relative));
                            //electricImg.Stretch = Stretch.Uniform;

                            dropDrapPanel.SetValue(Grid.RowSpanProperty, FrameMsg.ElectricCount);
                            dropDrapPanel.IsEnabled = false;

                            ImageBrush iBrush = new ImageBrush();
                            iBrush.ImageSource = new BitmapImage(new Uri("Img/Electric.png", UriKind.Relative));
                            stackOne.Background = iBrush;
                            stackOne.Height = 23 * FrameMsg.ElectricCount;

                            TextBlock tbElectric = new TextBlock();
                            tbElectric.Text = "电源";
                            tbElectric.Foreground = new SolidColorBrush(Colors.Black);
                            tbElectric.TextAlignment = TextAlignment.Center;
                            tbElectric.Height = 23;
                            tbElectric.Margin = new Thickness(0, 23 * FrameMsg.ElectricCount / 2 - tbElectric.Height / 2, 0, 0);

                            stackOne.Children.Add(tbElectric);
                        }

                        if (i > FrameMsg.TotalUCount - FrameMsg.ElectricCount && i < FrameMsg.TotalUCount)
                        {
                            dropDrapPanel.Visibility = Visibility.Collapsed;
                            dropDrapPanel.AllowDrop = false;
                        }
                    }
                    #endregion

                    #region <<电源个数是2的时候>>
                    if (FrameMsg.ElectricNo == 2)
                    {
                        if (i == FrameMsg.TotalUCount)//“只在第二行的时候进行设置”
                        {
                            dropDrapPanel.SetValue(Grid.RowSpanProperty, FrameMsg.ElectricCount / 2);
                            dropDrapPanel.IsEnabled = false;

                            ImageBrush iBrush = new ImageBrush();
                            iBrush.ImageSource = new BitmapImage(new Uri("Img/Electric.png", UriKind.Relative));
                            stackOne.Background = iBrush;
                            stackOne.Height = 23 * FrameMsg.ElectricCount / 2;

                            TextBlock tbElectric = new TextBlock();
                            tbElectric.Text = "电源";
                            tbElectric.Foreground = new SolidColorBrush(Colors.Black);
                            tbElectric.TextAlignment = TextAlignment.Center;
                            tbElectric.Height = 23;
                            tbElectric.Margin = new Thickness(0, 23 * FrameMsg.ElectricCount / (2 * 2) - tbElectric.Height / 2, 0, 0);

                            stackOne.Children.Add(tbElectric);
                        }

                        if (i > FrameMsg.TotalUCount - FrameMsg.ElectricCount / 2 && i < FrameMsg.TotalUCount)
                        {
                            dropDrapPanel.Visibility = Visibility.Collapsed;
                            dropDrapPanel.AllowDrop = false;
                        }

                        if (i == FrameMsg.ElectricCount / 2)//“最后FrameMsg.ElectricCount / 2行的时候的设置”
                        {
                            dropDrapPanel.SetValue(Grid.RowSpanProperty, FrameMsg.ElectricCount / 2);
                            dropDrapPanel.IsEnabled = false;

                            ImageBrush iBrush = new ImageBrush();
                            iBrush.ImageSource = new BitmapImage(new Uri("Img/Electric.png", UriKind.Relative));
                            stackOne.Background = iBrush;
                            stackOne.Height = 23 * FrameMsg.ElectricCount / 2;

                            TextBlock tbElectric = new TextBlock();
                            tbElectric.Text = "电源";
                            tbElectric.Foreground = new SolidColorBrush(Colors.Black);
                            tbElectric.TextAlignment = TextAlignment.Center;
                            tbElectric.Height = 20;
                            tbElectric.Margin = new Thickness(0, 23 * FrameMsg.ElectricCount / (2 * 2) - tbElectric.Height / 2, 0, 0);

                            stackOne.Children.Add(tbElectric);
                        }

                        if (i >= 1 && i < FrameMsg.ElectricCount / 2)
                        {
                            dropDrapPanel.Visibility = Visibility.Collapsed;
                            dropDrapPanel.AllowDrop = false;
                        }

                    }
                    #endregion

                    #region <<加载KVM>>

                    if (FrameMsg.KvmEndUNo != 0 && FrameMsg.KvmBeginUNo != 0)//存在KVM
                    {
                        int kvmNodeSize = FrameMsg.KvmEndUNo - FrameMsg.KvmBeginUNo + 1;
                        if (i == FrameMsg.KvmEndUNo)
                        {
                            dropDrapPanel.SetValue(Grid.RowSpanProperty, kvmNodeSize);
                            dropDrapPanel.IsEnabled = false;

                            //ImageBrush iBrush = new ImageBrush();
                            //iBrush.ImageSource = new BitmapImage(new Uri("Img/Electric.png", UriKind.Relative));
                            //stackOne.Background = iBrush;
                            stackOne.Background = new SolidColorBrush(Colors.DarkGray);
                            stackOne.Height = 23 * kvmNodeSize;

                            TextBlock tbKVM = new TextBlock();
                            tbKVM.Text = "KVM";
                            tbKVM.Foreground = new SolidColorBrush(Colors.Black);
                            tbKVM.TextAlignment = TextAlignment.Center;
                            tbKVM.Height = 23;
                            tbKVM.Margin = new Thickness(0, 23 * kvmNodeSize / 2 - tbKVM.Height / 2, 0, 0);

                            stackOne.Children.Add(tbKVM);
                        }

                        if (i < FrameMsg.KvmEndUNo && i >= FrameMsg.KvmBeginUNo)
                        {
                            dropDrapPanel.Visibility = Visibility.Collapsed;
                            dropDrapPanel.AllowDrop = false;
                        }

                    }

                    #endregion

                    #endregion

                    LayoutRoot.Children.Add(dropDrapPanel);

                }
            }
            ReturnUI = LayoutRoot;
        }

        #endregion

        #endregion

        //2011-12-14修改
        private bool isSuccess;

        private ComputerUnit CU;

        private PanelDragDropTarget DropPanel;

        public UIElement ReturnUI { get; set; }

        public NodeFrameView ReturnComputerMsg { get; set; }

        private RowFrameView FrameMsg;

        private ListBoxItem SelectItem;

        private int SelectIndex;

    }
}

原创粉丝点击