2013-07-15 41 views
0

我的问题在于,我正在开发一个小应用程序,以在SCCM 2012服务器上执行一些操作。使用Windows窗体传递对象

目前它只是创建,删除和移动文件夹。

我想要做的是有一个窗体,你登录。这已经完成。从这里你应该选择你想要做什么样的操作(例如移动或删除)。然后会弹出一个新的表单,并在这里做你的魔力。

这一切都很完美,但是,我认为我没有做到“正确”的方式。现在,我将连接对象传递给构造函数以创建所有创建的窗体,并且这些窗体是相互创建的。是否有意义?

我想要做的是拥有某种控制类,从创建登录表单的位置决定是否应该隐藏或显示,并将连接对象传递到我想要的位置,当它已被返回/保存。

我的问题是,当我创建表单时,所有的控制流都转到该表单。如果我可以在控制类中保留流,并且从这里控制是否根据成功登录来隐藏/显示表单,我宁愿选择。

我希望你能理解我的问题,并可能有解决方案吗?

这里是Form1的代码片段:

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     userName = textBox1.Text; 
     password = textBox2.Text; 

     getConnection = Connect(COMPUTER, userName, password); 

     if (connection != null) 
     { 
      Form2 form2 = new Form2(connection); 
      form2.Show(); 
      this.Hide(); 
     } 
    } 
    public WqlConnectionManager Connect(string serverName, string userName, string userPassword) 
    { 
     try 
     { 
      SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary(); 
      WqlConnectionManager connection = new WqlConnectionManager(namedValues); 

      if (System.Net.Dns.GetHostName().ToUpper() == serverName.ToUpper()) 
      { 
       // Connect to local computer. 
       connection.Connect(serverName); 
      } 
      else 
      { 
       // Connect to remote computer. 
       connection.Connect(serverName, userName, userPassword); 
      } 

      return connection; 
     } 
     catch (SmsException e) 
     { 
      MessageBox.Show("Failed to connect. Error: " + e.Message); 
      return null; 
     } 
     catch (UnauthorizedAccessException e) 
     { 
      MessageBox.Show("Failed to authenticate. Error: " + e.Message); 
      return null; 
     } 
    } 
+0

我想连接方法应该是在你的窗口2并调用它(这取决于什么ü想做的事)后,1)在表单加载事件或2)用户交互(用户想要做什么)。也应该将连接放置在不同的类(访问层)中。 – terrybozzio

+0

你可以通过它的声音将它作为一个单身人士 – Sayse

回答

0

做你正在尝试做的一种常见方法是让你与你的所有关于它的选择主要形式。当表单加载时,您启动登录表单(通常在主窗体的构造函数或OnShow方法中)。如果登录失败,则调用Application.Exit()。否则,你继续主要的形式。本质上,主要形式是您的控制器的

下面是什么我的意思是很简单样品..

public Form1() 
{ 
    InitializeComponent(); 

    LoginForm loginForm = new LoginForm(); 
    DialogResult result = loginForm.ShowDialog(); 
    if (result != System.Windows.Forms.DialogResult.OK) 
     Application.Exit(); 
} 

private void CreateButton_Click(object sender, EventArgs e) 
{ 
    CreateForm createForm = new CreateForm(); 
    createForm.Show(); 
} 

private void DeleteButton_Click(object sender, EventArgs e) 
{ 
    DeleteForm deleteForm = new DeleteForm(); 
    deleteForm.Show(); 
} 

private void MoveButton_Click(object sender, EventArgs e) 
{ 
    MoveForm moveForm = new MoveForm(); 
    moveForm.Show(); 
} 
+0

谢谢约翰!如果我这样做,然后按照其他关于在自己的图层/类中进行连接的注释,那么您会在哪里建立连接?将用户名和密码传递回控制表单,并从那里建立连接,或者在登录表单中建立连接,并将连接对象传递回控制表单?或者另一种方式? –

+0

我会以最高级别创建连接,然后将其传递给所有的孩子。在这个简单的例子中,我可能会在主窗体构造函数中完成它,并将其保留为窗体上的一个私有变量。 –

+0

好吧,非常感谢! –

相关问题