2017-03-23 19 views
1

リストボックスにデータをバインドしようとしています。私は問題なく何度でもDataBindを何回か使っていますが、ここでは何が問題なのか分かりません。 DataBind()を使用すると、このエラーが発生します。Databind()の問題Visual Studio 2015

An exception of type 'System.Web.HttpException' occurred in System.Web.dll but was not handled in user code 

Additional information: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Motherboards'. 

ASP:

<asp:ListBox ID="lbCategories" runat="server"></asp:ListBox> 

C番号:

protected void getCategories() 
{ 
    DAL dal = new DAL(conn); 
    dal.AddParam("all", "0"); 
    DataSet ds = dal.ExecuteProcedure("spGetCats"); 

    lbCategories.DataSource = ds.Tables[0]; 
    lbCategories.DataTextField = ds.Tables[0].Rows[0]["catName"].ToString(); 
    lbCategories.DataValueField = ds.Tables[0].Rows[0]["catID"].ToString(); 
    lbCategories.DataBind(); 
} 

データベーステーブル:

CREATE TABLE tbCats (
    catID INT IDENTITY(1,1) PRIMARY KEY, 
    catName VARCHAR(32) 
) 

手順:

CREATE PROCEDURE spGetCats(
    @all CHAR NULL 
) 
AS BEGIN 
    IF @all IS NULL 
     SELECT * FROM tbCats 
    ELSE 
     SELECT * FROM tbCats WHERE catID <> 1 
END 
GO 

挿入は:

INSERT INTO tbCats (catName) VALUES ('All'), ('Motherboards'), ('Memory'), ('Hard Drive'), ('SSDs'), ('CPUs'), 
            ('Video Cards'), ('Computer Cases'), ('Monitors'), ('Keyboards'), ('Mice') 

答えて

0
DataTextField

DataValueFieldは、列名をする必要があります。コードでは、最初の行の値に設定していました。

あなたが次の行に変更する必要が
protected void getCategories() 
{ 
    DAL dal = new DAL(conn); 
    dal.AddParam("all", "0"); 
    DataSet ds = dal.ExecuteProcedure("spGetCats"); 

    lbCategories.DataSource = ds.Tables[0]; 
    lbCategories.DataTextField = "catName"; 
    lbCategories.DataValueField = "catID"; 
    lbCategories.DataBind(); 
} 
+0

問題が何を投稿したのか分かりました。笑ありがとう –

0

:に

lbCategories.DataTextField = ds.Tables[0].Rows[0]["catName"].ToString(); 
lbCategories.DataValueField = ds.Tables[0].Rows[0]["catID"].ToString(); 

を:

lbCategories.DataTextField = "catName"; 
lbCategories.DataValueField = "catID"; 

またはこれもうまくいくかもしれない:

lbCategories.DataTextField = ds.Tables[0].Columns["catName"].ColumName; 
lbCategories.DataValueField = ds.Tables[0].Columns["catID"].ColumnName; 

それは列の名前を必要としますソースにバインドされるものを探す表示テキストと値として、現在のコードでは、最初の行の値がマザーボードになり、名前のようなデータソースには列がありません。