2010-06-25 41 views
1

非常簡單的問題......但奇怪的結果。 我只是試圖填補在C#中的下拉列表loading ASP.NET DropDownList

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!(Page.IsPostBack)) 
    { 
     LoadDropDowns();    
    } 
} 

protected void LoadDropDowns() 
{ 
    ddlVendor.DataSource = BL.GetAllVendors(); 
    ddlVendor.DataTextField = "VendorName"; 
    ddlVendor.DataValueField = "VendorName"; 
    ddlVendor.DataBind(); 
} 

BL.GetAllVendors是一個簡單的靜態類做到這一點:

public static List<Vendor> GetAllVendors() 
{ 
    return DL.GetAllVendors();  
} 

而且DL.GetAllVendors也是靜態類(數據層),其熄滅構建列表:

public static List<Vendor> GetAllVendors() 
{ 
    using(SqlConnection con = new SqlConnection(connString)) 
    { 
     //use sproc 
     SqlCommand cmd = new SqlCommand("selAllVendors", con); 
     cmd.CommandType = CommandType.StoredProcedure; 

     //temporary storage of list of vendors 
     List<Vendor> lv = new List<Vendor>(); 

     con.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     //continue as long as we have vendors 
     while (reader.Read()) 
     { 
      //instantiate a vendor 
      Vendor v = new Vendor((string)reader["VendorName"]); 
      //add them to the list 
      lv.Add(v); 
     } 
     //clean the reader 
     reader.Close(); 
     reader = null; 

     //return that list 
     return lv; 
    } 
} 

廠商類很簡單:

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

/// <summary> 
/// Summary description for Vendor 
/// </summary> 
namespace TK.Objects 
{ 
    public class Vendor 
    { 
     private string VendorName { get; set; } 

     public Vendor(string vn) 
     { 
      VendorName = vn; 
     } 
    } 
} 

我知道我的存儲介質是正確的,因爲我做了一個調試/監視,我發現它取消了兩個記錄「全部」和「微軟」。

而且存儲過程很簡單:

CREATE PROCEDURE selAllVendors 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

     SELECT 
     Vendor AS VendorName, 
     1 as SortOrder 
    FROM 
     Vendor 
    UNION ALL 
    SELECT 
     'All' AS VendorName, 
     0 as SortOrder 
    ORDER BY 
     SortOrder, 
     Vendor 
END 
GO 

但是當我運行此代碼我得到一個錯誤:

System.Web.HttpException was unhandled by user code 
    Message=DataBinding: 'TK.Objects.Vendor' does not contain a property with the name 'VendorName'. 
    Source=System.Web 
    ErrorCode=-2147467259 
    WebEventCode=0 
    StackTrace: 
     at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) 
     at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName, String format) 
     at System.Web.UI.WebControls.ListControl.PerformDataBinding(IEnumerable dataSource) 
     at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) 
     at System.Web.UI.WebControls.ListControl.PerformSelect() 
     at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 
     at _Default.LoadDropDowns() in c:\Users\Documents\Visual Studio 2010\WebSites\T\Default.aspx.cs:line 26 
     at _Default.Page_Load(Object sender, EventArgs e) in c:\Users\Documents\Visual Studio 2010\WebSites\T\Default.aspx.cs:line 17 
     at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) 
     at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) 
     at System.Web.UI.Control.OnLoad(EventArgs e) 
     at System.Web.UI.Control.LoadRecursive() 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 

缺少什麼我在這裏?

+0

請使用標籤來闡明您指的是哪種技術(webforms,winforms或其他框架)。 – VoodooChild 2010-06-25 17:04:37

+0

將賣方名稱屬性的範圍更改爲公共 – deostroll 2010-06-25 17:05:10

+0

另外,請勿在標題(「C#」)中重複標記。只要將它們留在標籤中即可。 – 2010-06-25 17:07:29

回答

5

VendorName您的Vendor類別的財產必須是公共而不是私人的。

+0

我沒有看到你們發佈:) – 2010-06-25 17:11:20

0

更改供應商類別屬性

private string VendorName { get; set; } 

public string VendorName { get; set; } 

,你應該都不錯。

0

您可以將此代碼用於類Vendor。

public class Vendor 
{ 
    private string vendorName = string.Empty; 

    public string VendorName 
    { 
     get { return vendorName; } 
     set { vendorName = value; } 
    } 

    public Vendor(string vn) 
    { 
     VendorName = vn; 
    } 
} 
+0

這會工作。問題,使用額外的私有變量「vendorName」會更好嗎?正如上面的例子中他們只有公共的VendorName? – aron 2010-06-25 17:34:01

+0

我已經發布了一個問題。我從那裏學習了c#3.0中的自動屬性。請閱讀。 http://stackoverflow.com/questions/3120140/defining-properties-of-a-class – 2010-06-25 17:54:14