0

私はASP.NETが初めてで、ドロップダウンリストがDetailsViewで正しく機能するようにしようとしていますが、今のところうまくいきません. 私はこれを達成するために近づいています。誰かがここで私を助けてくれることに感謝しています。

私が得ているエラーは次のとおりです。

Eval()、XPath()、および Bind() などのデータバインディング メソッドは、データバインドされたコントロールのコンテキストでのみ使用できます。

DetailsView に次のコードがあります。

<EditItemTemplate>  
    <asp:DropDownList id="VendorName" 
        datasourceid="VendorSqlDataSource" 
        AutoPostBack="true" 
        datatextfield="VendorName" 
        DataValueField="VendorID"    
        SelectedValue='<%# Bind("VendorID") %>'   
        runat="server" 
        OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" /> 

    <asp:SqlDataSource ID="VendorSqlDataSource" 
        ConnectionString="<%$Connectionstrings:ConnectionString%>"  
        SelectCommand="SELECT VendorID, VendorName from MDF_Vendor" 
        runat="server">  
    </asp:SqlDataSource>  
</EditItemTemplate>  


<EditItemTemplate> 
    <asp:DropDownList id="VendorBUName" 
        datasourceid="VendorBUSqlDataSource"  
        datatextfield="VendorBUName" 
        DataValueField="VendorBUID"    
        SelectedValue='<%# Bind("VendorBUID") %>'   
        runat="server"/> 

    <asp:SqlDataSource ID="VendorBUSqlDataSource" 
        runat="server" 
        ConnectionString="<%$Connectionstrings:ConnectionString%>" 
        selectcommand="SELECT VendorBUID, VendorBUName 
                       from MDF_VendorBU 
                       Where VendorID = @VendorID" 
        <SelectParameters>  
            <asp:Parameter Name="VendorID" Type="Int32" />  
        </SelectParameters>  
    </asp:SqlDataSource>  
</EditItemTemplate> 

私のコード ビハインド リストには、VendorName が選択されたときに VendorBUName ドロップダウンリストのリストを再構築するためのこのコードがあります。

protected void ddlVendor_SelectedIndexChanged
               (object sender, EventArgs e)
{

    DropDownList ddlVendor =
        (DropDownList)DetailsView1.FindControl("VendorName");
    DropDownList ddlVendorBU =
        (DropDownList)DetailsView1.FindControl("VendorBUName");


    if (ddlVendorBU != null)
    {
        Response.Write("SelectChanged");
        int VendorID = Convert.ToInt32(ddlVendor.SelectedValue.ToString());
        Response.Write("VendorID: " + VendorID);

        ddlVendorBU.Items.Clear();

        string strConn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection con = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT VendorBUID, VendorBUName FROM dbo.MDF_VendorBU WHERE VendorID = @VendorID";
        cmd.Parameters.AddWithValue("@VendorID", VendorID);
        DataSet objDs = new DataSet();
        SqlDataAdapter dAdapter = new SqlDataAdapter();
        dAdapter.SelectCommand = cmd;
        con.Open();
        dAdapter.Fill(objDs);

        con.Close();


        if (objDs.Tables[0].Rows.Count > 0)
        {
            foreach (DataRow dr in objDs.Tables[0].Rows)
            {
                ddlVendorBU.Items.Insert(0, new ListItem( (dr["VendorBUName"]).ToString(), "-1") );
            }
            ddlVendorBU.DataBind();  //<-- Problem HERE can not rebind it.
        }

    }
}

これは、これまでのところ DetailsView で機能しています。[編集] をクリックすると、これら 2 つのドロップダウン リストで正しい値が選択されました。VendorName ddl で別のベンダーを選択すると、VendorBUName リストが更新されます。すごい!ただし、ddlVendorBU.DataBind(); を実行しようとすると、VendorBUName リストを再バインドすると、上記のエラーが発生します。それを削除すると、フィールドにバインドされていないため、VendorBUName のレコードは更新されません。

誰かが助けてくれれば、私は完全に立ち往生しています。前もって感謝します!

4

3 に答える 3

1

ひょっとして、ページの読み込み時に何らかのバインドを行っていますか? もしそうなら、それがポストバックかどうかを確認していますか?選択変更イベントの前にページの読み込みが発生し、そこで何かがリバウンドした場合、同じデータを扱っていません。

于 2012-10-10T18:48:33.333 に答える
0

Bind("VendorBUID")プログラムで SelectedValue プロパティを設定せずに実行できますか? それがあなたの問題の原因だと思います。

ここで、ddlVendorBU を再バインドすると、手動で追加したものも消去されます。これがバインディングの機能であるためです。そのため、再バインドする前にプロパティを設定DataSourceして、適切な項目で DDL を作成することもできます。

また、ddlVendorBU に意味のあるSelectedValueプロパティを持たせたい (または推測する) ため、アイテムを追加するときにループを通過するたびに値パラメーターとして -1 を使用しないでください。BUID フィールドを使用します。

到着予定時刻: コード:

if (objDs.Tables[0].Rows.Count > 0) 
{
   ddlVendorBU.DataSource = objDs.Tables[0];
   ddlVendorBU.DataTextField = "VendorBUName";
   ddlVendorBU.DataValueField = "VendorBUID";
   ddlVendorBU.DataBind();
}
于 2012-10-10T17:30:25.867 に答える