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!
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;