2017-01-02 41 views
1
public partial class Form1 : Form 
{ 
private void StartApp() 
    { 
    LobGamma.LogInPanel.FillComboBox(LogInpanel_ComboBox, LobGamma.Connection.ObtainConnection()); 
    } 
} 


public class LogInPanel 
{ 
    public static void FillComboBox(ComboBox Box, SqlConnection con) 
    { 
     Box.Items.Clear(); 
     using (con) 
     { 
      SqlCommand com = new SqlCommand("Select Id From UsersTable", con); 
      con.Open(); 
      using (SqlDataReader reader = com.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        Box.Items.Add(reader["Id"].ToString()); 
       } 
       reader.Close(); 
      } 
     } 
     con.Close(); 
    } 

我想知道如果我要如何使用的方法从另一个类的正确途径。我只需要使用该方法一次。我通过使用静态方法可以接受吗?或者该方法应该是非静态的。从另一个类调用方法的正确方法是什么?

如果方法应该是非静态的,它是最好的自IDisposable来继承,这样我可以在using语句使用类?或者只是创建一个类的实例并等待GC可以接受?

+2

这是不是真的回答你的问题,但我认为你不应该使用'using'上'SqlConnection'已传递给方法的参数。这可能不是一个好主意,因为你正在处理从方法之外给出的实例。这可能会让来电者感到惊讶。考虑将'using'移动到'StartApp'方法或创建'SqlConnection'内部'FillComboBox'。 – wkl

+0

谢谢,很高兴知道。 – Jones

+1

static/instance在这里并不重要。你的代码是OK的,但它仍然混合了GUI和业务逻辑。考虑一种不知道Comoboxes的方法,但返回一个'List ' –

回答

1

在我看来,FillComboBox应该在窗体类的私有非静态方法:

public partial class Form1 : Form 
{ 

    private void StartApp() 
    { 
     LobGamma.LogInPanel.FillComboBox(LogInpanel_ComboBox, LobGamma.Connection.ObtainConnection()); 
    } 
    private void FillComboBox(ComboBox Box, SqlConnection con) 
    { 
     Box.Items.Clear(); 
     using (con) 
     { 
      SqlCommand com = new SqlCommand("Select Id From UsersTable", con); 
      con.Open(); 
      using (SqlDataReader reader = com.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        Box.Items.Add(reader["Id"].ToString()); 
       } 
       reader.Close(); 
      } 
     } 
     con.Close(); 
    } 
} 

这是因为所有FillComboBox所做的是弄清楚内容应该是在组合框中的内容。这与UI有关,为什么不把它放在表单类中呢?表单类应该初始化UI组件和UI相关的东西,这正是FillComboBox正在做的事情。

是否最好从IDisposable继承,以便我可以在使用语句中使用该类?

你只需要实现IDisposable如果有东西被布置。但既然你已经在FillComboBox里面有使用声明了,一切都已经处理好了!

另外,不通过组合框都:

private void FillComboBox(ComboBox Box, SqlConnection con) 
    { 
     LogInpanel_ComboBox.Items.Clear(); 
     using (con) 
     { 
      SqlCommand com = new SqlCommand("Select Id From UsersTable", con); 
      con.Open(); 
      using (SqlDataReader reader = com.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        LogInpanel_ComboBox.Items.Add(reader["Id"].ToString()); 
       } 
       reader.Close(); 
      } 
     } 
     con.Close(); 
    } 
+0

我基本上写了相同的答案,所以我只想指出,您不必以这种方式传递组合框,因为它是类的成员,并且可以使用'this.LogInpanel_ComboBox'进行检索,该类更具可读性到(你知道它住在哪里可以这么说) – nozzleman

+0

@nozzleman我希望OP可能有其他想要被填充的组合框。但是,这是个好主意。我会编辑 – Sweeper

+0

还,如果还没有做到这一点的方法:这种类型的行为通常是由连接到窗体'Load'-事件 – nozzleman

0

的问题是,如果你真的需要一个类为该操作。 在构造中填充对象的项目列表可以通过构造函数调用的一个方法轻松完成,并且不需要是类。然而,如果你正在构建一个像dataContext这样的处理业务和你的数据层(例如数据库)之间的连接的大东西,那么你应该使用一个普通的类(或者甚至更好地使用像Entity Framework这样的东西)。

对于微小的CRUD操作只需使用一个私有方法。

相关问题