Search code examples
c#asp.net.netdetailsview

Reuse the same function for ItemTemplate and EditTemplate


I am new to ASP.NET. I have this in my 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>

This is my code behind for the Edit mode, which will refresh the dropdownlist.

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() ));
            }
        }
    }
}

As you can see in the EditItemTemplate, I have updateVendorName ID for the dropdownlist, and this ddl calls the ddlVendor_SelectedIndexChange to refresh another list. Now, I want to use the same code to refresh the list, but in InsertItemTemplate. Because of the dropdownlist ID is different "insertVendorName", how can I use the same ddlVendor_SelectedIndexChange code, but with different ddl ID (insertVendorName) in the Insert Mode? Please let me know if I am confusing you.

Any suggestions for the better way to do this would be appreciated. Thanks in advance!


Solution

  • You can use the same function for both DDLs. So you'd have:

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

    Now inside the function itself you need to get a reference to the correct DDL, the one that called the function. That's what sender is for.

    DropDownList ddlVendor = (DropDownList)sender;