2011-06-07 132 views
0

我正在进入oop的第一步,这需要对我的应用程序进行彻底删除,并将其重新设计为3层和面向对象。 叹息。我有一个提交对象,它应该包含一个客户对象(以及一个代理和覆盖对象);我想在每个包含的对象的字段中存储来自数据库的一些datareader结果,但是当我尝试用新的提交对象调用Customer对象时,我什么也得不到。 VS不承认提交包含一个Customer对象。我明显错过了一些关键点,所以考虑到这一点,想法?下面的代码。在另一个C#类中创建一个对象?

//This is the Submission class here 
public class Submission 
{ 
    public int SubmissionId {get;set;} 
    public int Status { get; set; } 
    public string StatusComment { get; set; } 


    public class Customer 
    { 
     //public Customer() { } 
     public int CustId { get; set; } 
     public string CustName { get; set; } 
     public string CustAddress { get; set; } 
     public string CustState { get; set; } 
     public string CustCity { get; set; } 
     public int CustZip { get; set; } 
     public int SicNaic { get; set; } 

    } 

    public object Customer(); 
} 


//These lines throw an error: 

无法通过表达式引用类型。 VS无法识别TempSubmission.Customer在提交内部对Customer对象的调用。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data; 
using System.Data.SqlClient; 


/// This query should selects the relevant data for a gridview on the presentation layer and stores in a list. 
/// Don't quite know how to bind it to the gridview yet, but that's a different question. 

public class SubmissionDatabaseService 
{ 
    public List<Submission> GetAllSubmissions() 
    { 
     string Searchstring = "SELECT Submission.SubmissionId, Customer.CustName, Customer.CustCity, Customer.CustState, Broker.BroName, Broker.BroState, Broker.EntityType, Submission.Coverage, Status.Status FROM Submission INNER JOIN Broker ON Broker.BroId = Submission.BroId INNER JOIN Customer ON Customer.CustId = Submission.CustId INNER JOIN Status ON Status.StatusId = Submission.StatusId"; 
     string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;   
     SqlConnection conn = new SqlConnection(connectionString); 

     SqlDataReader dr = null; 

     try 
     { 
      conn.Open(); 

      SqlCommand Searchcmd = new SqlCommand(Searchstring, conn); 

      dr = Searchcmd.ExecuteReader(); 
      List <Submission> lstSubmission; 
      Submission tempSubmission; 
      while (dr.Read()) 
      { 
       tempSubmission = new Submission(); 
       tempSubmission.SubmissionId = dr.GetInt32(0); 
       tempSubmission.Customer.CustName = dr.GetString(1); 
       tempSubmission.Customer.CustCity = dr.GetString(2); 
       tempSubmission.Customer.CustState = dr.GetString(3); 
       tempSubmission.Broker.BroName = dr.GetString(4); 
       tempSubmission.Broker.BroState = dr.GetString(5); 
       tempSubmission.Broker.EntityType = dr.GetString(6); 
       tempSubmission.SubmissionCoverage.Coverage = dr.GetInt32(7); 
       tempSubmission.Status = dr.GetInt32(8); 

       //Add rest of the fields 
       lstSubmission.Add(tempSubmission); 
      } 
     } 

     return lstSubmission; 
    } 
} 
+0

尝试使用声明移动到顶部 – Grozz 2011-06-07 19:29:01

+0

目前你的客户定义为一个内部类的提交而这并不是我想你想。您希望客户成为提交之后的顶级课程,并且提交内容需要参考客户实例。 – ribram 2011-06-07 19:29:37

回答

6

Ooo ..从哪里开始?把你的客户类它自己的文件Customer.cs,并在其自己的文件Submission.cs您所提交的类

然后,你可以做一个简单的提交类,像这样:

public class Submission 
{ 
     // consider implementing the below as properties to more finely control access 
     public int SubmissionId; 
     public int Status; 
     public string StatusComment; 
     public Customer SubmissionCustomer; // <-- this is null until you set it to a Customer object, either in the constructor or externally. 

     public Submission() { 
      // constructor 
     } 

} 

然后在属性念起来建设者,并将它们洒在你认为合适的地方。请参阅:

http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx

性能有私人/公共模式。至于构造函数:

参见:

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

构造函数的调用,只要你创建一个类的实例(对象)。

+0

您将成员添加为公共字段,属性可能是更好的选择。 – 2011-06-07 19:35:08

+0

同意,只是想保持简单开始;)Brazos - 使用属性。 – mikey 2011-06-07 19:35:59

+0

谢谢,@Mikey。那是我需要的。如此多的信息,当你不知道正确的问题时很难找到正确的东西,你知道吗? – 2011-06-07 19:46:48

0

只需在提交内定义客户对象,不会使提交包含客户的实例。对于您想要执行的操作,只需将“客户”提交到“提交”外并在“提交”中定义“客户”属性。

0

您正试图通过tempSubmission参考实际类型Customer。您必须改为参考Customer的实例,该实例将通过某个物业或类似物品展示。

0

问题是您的客户类型不够具体,它被定义为对象而不是客户。

达到你想要做的,你将不得不在这种情况下Customer类型的属性添加一个新成员到您Submission类,你public object Customer();做了什么基本meams,定义一个名为类型的对象Customer方法。

,你会想要做的是确定什么,例如RelatedCustomer

Public Customer RelatedCustomer{get;set;} 
1

我想你想要什么是Customer类是提交类之外,为被叫Customer类型的属性提交类包含Customer的一个实例。

public class Submission 
{ 
    public Submission() 
    { 
     this.Customer = new Customer(); 
    } 

    public int SubmissionId { get; set; } 
    public int Status { get; set; } 
    public string StatusComment { get; set; } 
    public Customer Customer { get; set; } 
} 
public class Customer 
{ 
    //public Customer() { } 
    public int CustId { get; set; } 
    public string CustName { get; set; } 
    public string CustAddress { get; set; } 
    public string CustState { get; set; } 
    public string CustCity { get; set; } 
    public int CustZip { get; set; } 
    public int SicNaic { get; set; } 
} 
相关问题