2017-01-02 43 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操作只需使用一個私有方法。

相關問題