1

ASP.NET は初めてです。私はこれを私のDetailsViewに持っています:

<asp:TemplateField HeaderText="VendorName">
    <InsertItemTemplate>
        <asp:DropDownList id="insertVendorName" datasourceid="VendorSqlDataSource"
            datatextfield="VendorName" DataValueField="VendorID" 
            SelectedValue='<%# Bind("VendorID") %>'
            runat="server" AutoPostBack="true">
            <asp:ListItem Text="Select" Value="-1" />
        </asp:DropDownList>
    </InsertItemTemplate>
    <EditItemTemplate>
        <asp:DropDownList id="updateVendorName" 
        datasourceid="VendorSqlDataSource"  AutoPostBack="true"
        datatextfield="VendorName" DataValueField="VendorID"  
        SelectedValue='<%# Bind("VendorID") %>'     
        runat="server" OnSelectedIndexChanged="ddlVendor_SelectedIndexChanged"  />
    </EditItemTemplate>
</asp:TemplateField>

これは、ドロップダウン リストを更新する編集モード用のコード ビハインドです。

protected void ddlVendor_SelectedIndexChanged (object sender, EventArgs e)
{
    DropDownList ddlVendor = (DropDownList)DetailsView1.FindControl("updateVendorName");
    DropDownList ddlVendorBU = (DropDownList)DetailsView1.FindControl("VendorBUName");

    /*
    if (DetailsView1.CurrentMode != DetailsViewMode.Edit)
    {
        DropDownList ddlVendor = (DropDownList)DetailsView1.FindControl("insertVendorName");
        int VendorID = Convert.ToInt32(ddlVendor.SelectedValue.ToString());
    }
    else
    {
        DropDownList ddlVendor = (DropDownList)DetailsView1.FindControl("VendorName");
        int VendorID = Convert.ToInt32(ddlVendor.SelectedValue.ToString());
    }
    */

    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)  
        { 
           ddlVendorBU.DataSource = objDs.Tables[0];
           ddlVendorBU.ItemTextField = "VendorBUName";
           ddlVendorBU.ItemValueField = "VendorBUID";
           ddlVendorBU.DataBind(); 
        } 
        */

        if (objDs.Tables[0].Rows.Count > 0)
        {
            foreach (DataRow dr in objDs.Tables[0].Rows)
            {
                ddlVendorBU.Items.Insert(0, new ListItem((dr["VendorBUName"]).ToString(), (dr["VendorBUID"]).ToString() ));
            }
        }
    }
}

EditItemTemplate でわかるように、ドロップダウン リストの updateVendorName ID があり、この ddl は ddlVendor_SelectedIndexChange を呼び出して別のリストを更新します。ここで、同じコードを使用してリストを更新したいと思いますが、InsertItemTemplate. ドロップダウンリスト ID が「insertVendorName」と異なるため、挿入モードで同じ ddlVendor_SelectedIndexChange コードを異なる ddl ID (insertVendorName) で使用するにはどうすればよいですか? 混乱している場合はお知らせください。

これを行うためのより良い方法についての提案をいただければ幸いです。前もって感謝します!

4

2 に答える 2

1

最も簡単に言えば、イベント ハンドラーのコードを別の関数に配置し、そこから呼び出す必要があります。スケルトン構造を示します。

protected void ddlVendor_SelectedIndexChanged (object sender, EventArgs e)
{
    MyFunction(sender);
}


protected void ddlInsertVendorName_SelectedIndexChanged (object sender, EventArgs e)
{
    MyFunction(sender);
}

protected void MyFunction(Object sender)
{
    DropDownList ddl = (DropDownList)sender //ddl will contain the ID etc...
    //shared logic here

    if(ddl.ID.equals("ddlVendor"))
    {
        //edit mode
    }
    else 
    {
        //insert mode
    }
}

このソリューションは、一方のドロップダウン リストのイベント ロジックを変更する必要があり、もう一方のドロップダウン リストを変更する必要がない場合、コードを再構築する必要があるという点で、System Down の (それ以外の場合は優れたソリューション) よりもわずかに優れています。

また、別の関数が共有ロジックのみを実行し、コンテキスト固有のロジックをそれぞれのイベント ハンドラーに配置すると、さらに効果的です。これには、別の関数が何かを返すようにする必要がある場合があります。

于 2012-10-11T17:51:32.050 に答える
1

両方の DDL に同じ関数を使用できます。したがって、次のようになります。

<asp:DropDownList id="insertVendorName" .... OnSelectedIndexChanged="ddlVendor_SelectedIndexChanged" >

ここで、関数自体の内部で、関数を呼び出した正しい DDL への参照を取得する必要があります。それsenderがそのためです。

DropDownList ddlVendor = (DropDownList)sender;
于 2012-10-11T17:45:07.447 に答える