2016-11-11 28 views
-1

我遇到的问题是我可以成功使用我创建的Room对象的RoomID,但不能使用面板。这里是我将标签设置为房间名称的功能。 (这是我的Form1.cs)C#对象面板

public partial class Form1 : Form 
{ 
    Room ThisRoom = new Room(); 
    public Form1() 
    { 
     InitializeComponent();   
     this.Text = "Aquinas College Master Controller"; 
    } 

    private void roomDesignerToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     new RoomDesigner().Show(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     roomsToolStripMenuItem.DropDownItems.Clear(); 
     foreach (var Room in Global.Aquinas.Aquinas) 
     { 
      ToolStripMenuItem NewItem = new ToolStripMenuItem(Room.RoomID); 
      NewItem.Name = Room.RoomID; 
      NewItem.Click += new EventHandler(ItemClick); 
      roomsToolStripMenuItem.DropDownItems.Add(NewItem); 
     } 
    } 

    void ItemClick(object sender, EventArgs e) 
    { 
     ToolStripItem item = (ToolStripItem)sender; 
     label2.Text = item.Name; 
     foreach (var Room in Global.Aquinas.Aquinas) 
     { 
      if (Room.RoomID == item.Name) 
      { 
       ThisRoom = Room; 
       break; 
      } 
     } 
     Panel RoomPanel = ThisRoom.Panel; 
     RoomPanel.Size = new Size(607, 304); 
     RoomPanel.Location = new Point(144, 27); 
     RoomPanel.BackColor = Color.White; 
     this.Controls.Add(RoomPanel); 
    } 
} 

这是我的一些房间对象的代码。 (这是在Room.cs)

public class Room 
{ 

    private List<CtrlComputer> _Computers; 

    public List<CtrlComputer> Computers 
    { 
     get { return _Computers; } 
     set { _Computers = value; } 
    } 

    private string _RoomID; 

    public Room() 
    { 
     _Computers=new List<CtrlComputer>(); 
    } 

    public string RoomID 
    { 
     get 
     { 
      return _RoomID; 
     } 

     set 
     { 
      _RoomID = value; 
     } 
    } 

    public Panel Panel 
    { 
     get 
     { 
      return _Panel; 
     } 

     set 
     { 
      _Panel = value; 
     } 
    } 

    private Panel _Panel; 
} 

而这里是我注册了我刚刚把我的设计,以一个新的房间面板。 (这是我的一些RoomDesigner.cs的)

public partial class RoomDesigner : Form 
{ 
    Room NewRoom = new Room(); 
    Panel RoomDesignerPanel = new Panel(); 
    public RoomDesigner() 
    { 
     InitializeComponent(); 
     RoomDesignerPanel.Size = new Size(607, 304); 
     RoomDesignerPanel.Location = new Point(144, 27); 
     RoomDesignerPanel.BackColor = Color.White; 
     this.Controls.Add(RoomDesignerPanel); 
     textBox1.ForeColor = SystemColors.GrayText; 
     textBox1.Text = "Enter Computer ID Here"; 
     this.textBox1.Leave += new System.EventHandler(this.textBox1_Leave); 
     this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter); 
     textBox2.ForeColor = SystemColors.GrayText; 
     textBox2.Text = "Enter Room ID Here"; 
     this.textBox2.Leave += new System.EventHandler(this.textBox2_Leave); 
     this.textBox2.Enter += new System.EventHandler(this.textBox2_Enter); 
    } 

    private void textBox1_Leave(object sender, EventArgs e) 
    { 
     if (textBox1.Text.Length == 0) 
     { 
      textBox1.Text = "Enter Computer ID Here"; 
      textBox1.ForeColor = SystemColors.GrayText; 
     } 
    } 

    private void textBox1_Enter(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "Enter Computer ID Here") 
     { 
      textBox1.Text = ""; 
      textBox1.ForeColor = SystemColors.WindowText; 
     } 
    } 
    private void textBox2_Leave(object sender, EventArgs e) 
    { 
     if (textBox2.Text.Length == 0) 
     { 
      textBox2.Text = "Enter Room ID Here"; 
      textBox2.ForeColor = SystemColors.GrayText; 
     } 
    } 

    private void textBox2_Enter(object sender, EventArgs e) 
    { 
     if (textBox2.Text == "Enter Room ID Here") 
     { 
      textBox2.Text = ""; 
      textBox2.ForeColor = SystemColors.WindowText; 
     } 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     CtrlComputer NewComputer = new CtrlComputer(); 
     NewComputer.ComputerID = textBox1.Text; 
     NewComputer.Text = NewComputer.ComputerID; 
     NewComputer.Parent = RoomDesignerPanel; 
     RoomDesignerPanel.Controls.Add(NewComputer); 
     NewRoom.Panel = RoomDesignerPanel; 
     NewRoom.Add(NewComputer); 
    } 

当我尝试重新加载面板,该对象的RoomID返回罚款,但该面板是不是。有任何想法吗?

编辑:对不起,在我的岗位不明确的,第一职位并不容易。 该面板是在设计器中创建的,但我试过private Panel Panel1 = new Panel();,但没有运气。我目前的问题是,在Form1.cs中,程序将抛出“无法访问已处理的对象”,但我在这里遵循指南https://msdn.microsoft.com/en-us/library/82785s1h(v=vs.110).aspx

+0

有点难以说没有看到更多的代码,但我认为panel1 = ThisRoom.Panel;在第一个代码块可能不是你想要的。就像完成了设置panel1的背景颜色一样,将panel1替换为另一个面板(可能)。如果panel1是您的设计器代码的一部分,如我所怀疑的那样,替换该引用将不会执行任何操作。 this.Controls包含对“panel1”的重要参考,因为这是Form从其呈现控件的位置。 –

+0

由于我没有看到任何代码创建任何新的Panel对象,我认为你只有一个单独的Pan​​el对象被传递(由设计器代码创建的对象) –

+0

如果您可以发布您的(相关)设计器代码并包含什么范围的片段以上是在我或其他人可能能够帮助更多 –

回答

0

你所希望做的是面板对象的集合之间的交换(有点像你自己的版本的TabPages的)。要做到这一点,你需要创建每个Panel对象(你可以在RoomDesigner中这样做,这很好,但有一个问题:请参阅下面的*)。手头上有这个集合,当你想在窗体上显示它时,你需要移除panel1创建的设计器代码(Controls.Remove(panel1))并插入新的(Controls.Add(RoomPanel))。

由于控制利用系统资源,确保处置您将不再使用任何控制。以下是一个示例方法:

//Initial case where no room has been displayed yet and panel1 is still valid 
    private Panel CurrentPanel = null; 

    public void SwapPanel(Panel p) 
    { 
     //If no panel has been placed yet, get rid of the default one 
     if (panel1 != null) 
     { 
      //we should never need the designer panel again, so dispose it 
      panel1.Dispose(); 
      this.Controls.Remove(panel1); 
     } 
     else 
     { 
      //we may return to this panel later, so don't dispose it 
      this.Controls.Remove(CurrentPanel); 
     } 
     CurrentPanel = p; 
     this.Controls.Add(p); 
    } 

当您最后关闭并且不再需要存储在您的Room集合中的面板时,请务必将其丢弃。 (但是,如果您的整个程序正在退出,那么它无关紧要,但无论如何都是最佳做法)

*当您关闭任何RoomDesigner窗体(或任何窗体)时,它包含在“控制'将被处置,即使你在别处使用它们。为防止出现这种情况,请在RoomDesigner Controls集合关闭之前删除要保留的控件。

+0

我说这和它的作品:'私人无效button2_Click(对象发件人,EventArgs的){ NewRoom.RoomID = textBox2.Text; NewRoom.Panel = RoomDesignerPanel; Global.Aquinas.Aquinas.Add(NewRoom);这个.Controls.Remove(RoomDesignerPanel); this.Dispose(); }' –

+0

this.Dispose将处理您的表单。我不太确定你想这样做 –

+0

我需要摆脱那种形式,因为每次我想添加一个房间时,我都需要制作新的。除非有更好的方法,比如重置表单。我接受建议。 –