2009-05-15 4 views
0

User_Idのように、_(アンダースコア)のプライマリキーを持つテーブルがあります。 SubSonicがDALを生成すると、アンダースコアが削除されます。以下のように今、私は、DropDownListコントロールにオブジェクトのコレクションを結合しています:データソートに列が存在しませんSubSonicコレクションをドロップダウンするとき

private void LoadCbo() 
{ 
    UserCollection users=(new UserCollection()).Load(); 
    User u=new User(){ 
     UserId=-1, 
     Name="[Select]"}; 
    users.Insert(0,u); 

    ddlUsers.DataSource=users; 
    ddlUsers.DataValueField=User.Columns.UserId; 
    ddlUsers.DataTextField=User.Columns.Name; 
    ddUsers.DataBind();  
} 

を、それを実行するには、そのオブジェクトが名前「USER_ID」と列が含まれていないと言われます。

PS: - 「UserId」を使用すると問題なく動作します。私はこれがSubSonic(2.1)のバグか、何か間違っているかどうかを知りたいだけです。

答えて

1

、あなたもこれを行うことができます。

+0

あなたはそれについての思い出に感謝します。 –

+0

@ranmoreに感謝これは正しい方法です! – TheVillageIdiot

2

Columnsコレクションは、オブジェクトのプロパティ名ではなく、データベース内の列名で構成されています。これはバグではありません。それは機能の不可欠な部分です。それ以外の場合、SubSonicは実際のデータベースを照会する方法を知らないでしょう。

次の行は、ドロップダウンリストの値を移入するときに使用するプロパティを指定します

ddlUsers.DataValueField=User.Columns.UserId; 

User.Columns.UserIdの値が「USER_ID」になり、それは列の名前ですあなたのデータベーステーブルではなく、プロパティの名前です。ただし、ddlUsersがデータバインディングの場合、User_Idという名前のUserオブジェクトのプロパティを見つけることができません。これは、SubSonicがDALを生成するときにプロパティ名からアンダースコアを削除するためです。 (ranomoreで指摘したように)最高の修正がある:あなたのコード内の列名をハードコーディングを避けることができ

ddlUsers.DataValueField = User.UserIdColumn.PropertyName; 

この方法:亜音速の2.2では

ddlUsers.DataValueField = User.UserIdColumn.PropertyName; 
+0

@adam psにご注意ください。 「これがSubSonic(2.1)のバグか、何か間違っているかどうかを知りたければ」 あなたが示唆していることは問題に書かれています。私はすでに、列名を文字列( "UserId")として指定することがそのトリックを行うことを知っています。私はUserオブジェクト(データベースからの行ではない)にバインドするので、Columns.UserIdは、オブジェクトを取得してデータベースに値をプッシュする目的ではなく、オブジェクトのプロパティにあるとおりに名前を返す必要があります。 SubSonicが列名を変更している場合は、外部オブジェクトに変更された名前を与え、DBとの会話のためにテーブルの名前を使用するように注意する必要があります。 – TheVillageIdiot

+1

私はそれをもっと明白にするために私の答えを明確にしました。 Columnsコレクションは特にDBとの対話のためにありますので、プロパティ名ではなくDB名を返す必要があります。それを使用して、データバインドのプロパティを指定することによって、何か間違ったことをしています。 –

+0

PSの質問に対する答えは:「これはSubSonicのバグではありません。何か間違っています。 –

関連する問題