Catching an SelectedIndexChanged event from a DropDownList inside a DataGrid

Discussion in 'ASP .Net' started by Dominic, Jun 30, 2003.

  1. Dominic

    Dominic Guest

    Hi guys,

    I'm not sure if this question belongs to FAQ, but I couldn't find a
    concrete answer.

    I created a Datagrid control using ItemTemplate, but it's NOT a
    in-place editing datagrid. One of the columns of the data grid
    contains a DropDownlist. I managed to create this datagrid control as
    follows.

    <asp:datagrid RunAt="server" id="dgItem" DataKeyField="ItemId"...
    <columns>
    <asp:TemplateColumn HeaderText="Category">
    <ItemTemplate>
    <asp:DropDownList RunAt="server" ID="ddlCategory" />
    ......

    The code-behind source looks like

    private void Page_Load(object sender, System.EventArgs e)
    {
    if (!IsPostBack)
    {
    dgTest.DataSource = GetItemList();
    dgTest.DataBind();
    }
    }

    private void OnItemDataBound(object sender, DataGridItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item)
    {
    int itemId = (int)dgItem.DataKeys[e.Item.ItemIndex];

    DropDownList ddlCategory =
    (DropDownList)e.Item.FindControl("ddlCategory");
    ddlCategory .DataSource = GetCateoryList();
    ddlCategory .DataBind();
    }
    }

    This approach works quite well to populate the drop-down list and the
    grid itself. However, I have two questions here.

    1. How can I catch the "SelectedItemChanged" event fired from the
    drop-down-list "ddlCategory"?

    One of the previous posting mentioned that we can catch ControlAdded
    event and add the SelectedItemChanged event there....

    private void dataGrid1_ControlAdded(object sender, ControlEventArgs e)
    {
    if(e.Control.GetType == typeof(ComboBox))
    ((DropDownList)e.Control).SelectedIndexChanged += new
    System.EventHandler(dropDownList_SelectedIndexChanged);
    }

    Unfortunately, ControlAdded event is only for WinForms, not WebForms
    (Right??)

    A possible alternative is to use event bubbling. However, this
    involves subclassing the dropdownlist to raise bubble event. Right?

    Other than the event bubbling, is there any other easier method? Some
    codes for illustration will be much appreciated.

    2. The above datagrid items actually contains subitems. It is
    something like

    HeaderA HeaderB HeaderC
    Item1A Item1B Item1C
    Item11A Item11B Item11C
    Item12A Item12B Item12C
    Item2A Item2B Item2C
    Item21A Item22B Item22C

    where Item11A and Item12A is the sub-item of Item1A, etc.

    I implemented the above as two levels of datagrid. Item1 and Item2
    belong to datagrid of level1, while Item11, 12, 21, etc are level2. As
    illustrated in the first part of my question, I can easily catch the
    ItemDataBound event of level1 datagrid. But, how can I catch the
    ItemDataBound of level2 data grid?

    Thanks again
    Dominic
    Dominic, Jun 30, 2003
    #1
    1. Advertising

  2. Dominic

    Dominic Guest

    Thank you for your reply. But I still don't quite get it.

    Since there are multiple rows in a datagrid, there will be multiple
    Dropdownlists (each one corresponds to one row). So, when
    DG1DropDownList is called, which row does it correspond to this event?

    Please also see my second question regarding ItemDataBound. This is a
    similar question to the first one. Instead of catching the
    SelectedItemChanged event from a dropdownlist inside a row of a
    datagrid, this is a question about how to catch a ItemDataBound event
    from a datagrid inside a row of a datagrid.

    Thanks
    Dominic
    "Saravana" <> wrote in message news:<>...
    > You can add event handler to dropdownlist like this,
    > <asp:TemplateColumn headertext="Month">
    > <ItemTemplate>
    > <asp:DropDownList id="MonthACT" datavaluefield="Value"
    > datatextfield="Name" DataSource="<%#oMonthDataSet%>" runat="server"
    > OnSelectedIndexChanged="DG1DropDownListSelect" >
    > </asp:DropDownList>
    > </ItemTemplate>
    > </asp:TemplateColumn>
    > --
    > Saravana
    > Microsoft India Community Star,
    > MCAD,SE,SD,DBA.
    >
    >
    > "Dominic" <> wrote in message
    > news:...
    > > Hi guys,
    > >
    > > I'm not sure if this question belongs to FAQ, but I couldn't find a
    > > concrete answer.
    > >
    > > I created a Datagrid control using ItemTemplate, but it's NOT a
    > > in-place editing datagrid. One of the columns of the data grid
    > > contains a DropDownlist. I managed to create this datagrid control as
    > > follows.
    > >
    > > <asp:datagrid RunAt="server" id="dgItem" DataKeyField="ItemId"...
    > > <columns>
    > > <asp:TemplateColumn HeaderText="Category">
    > > <ItemTemplate>
    > > <asp:DropDownList RunAt="server" ID="ddlCategory" />
    > > .....
    > >
    > > The code-behind source looks like
    > >
    > > private void Page_Load(object sender, System.EventArgs e)
    > > {
    > > if (!IsPostBack)
    > > {
    > > dgTest.DataSource = GetItemList();
    > > dgTest.DataBind();
    > > }
    > > }
    > >
    > > private void OnItemDataBound(object sender, DataGridItemEventArgs e)
    > > {
    > > if (e.Item.ItemType == ListItemType.Item)
    > > {
    > > int itemId = (int)dgItem.DataKeys[e.Item.ItemIndex];
    > >
    > > DropDownList ddlCategory =
    > > (DropDownList)e.Item.FindControl("ddlCategory");
    > > ddlCategory .DataSource = GetCateoryList();
    > > ddlCategory .DataBind();
    > > }
    > > }
    > >
    > > This approach works quite well to populate the drop-down list and the
    > > grid itself. However, I have two questions here.
    > >
    > > 1. How can I catch the "SelectedItemChanged" event fired from the
    > > drop-down-list "ddlCategory"?
    > >
    > > One of the previous posting mentioned that we can catch ControlAdded
    > > event and add the SelectedItemChanged event there....
    > >
    > > private void dataGrid1_ControlAdded(object sender, ControlEventArgs e)
    > > {
    > > if(e.Control.GetType == typeof(ComboBox))
    > > ((DropDownList)e.Control).SelectedIndexChanged += new
    > > System.EventHandler(dropDownList_SelectedIndexChanged);
    > > }
    > >
    > > Unfortunately, ControlAdded event is only for WinForms, not WebForms
    > > (Right??)
    > >
    > > A possible alternative is to use event bubbling. However, this
    > > involves subclassing the dropdownlist to raise bubble event. Right?
    > >
    > > Other than the event bubbling, is there any other easier method? Some
    > > codes for illustration will be much appreciated.
    > >
    > > 2. The above datagrid items actually contains subitems. It is
    > > something like
    > >
    > > HeaderA HeaderB HeaderC
    > > Item1A Item1B Item1C
    > > Item11A Item11B Item11C
    > > Item12A Item12B Item12C
    > > Item2A Item2B Item2C
    > > Item21A Item22B Item22C
    > >
    > > where Item11A and Item12A is the sub-item of Item1A, etc.
    > >
    > > I implemented the above as two levels of datagrid. Item1 and Item2
    > > belong to datagrid of level1, while Item11, 12, 21, etc are level2. As
    > > illustrated in the first part of my question, I can easily catch the
    > > ItemDataBound event of level1 datagrid. But, how can I catch the
    > > ItemDataBound of level2 data grid?
    > >
    > > Thanks again
    > > Dominic
    Dominic, Jul 2, 2003
    #2
    1. Advertising

  3. Dominic

    Saravana Guest

    You are correct, there will one eventhandler for all the dropdownlist. In
    that eventhanlder,
    If your try to get parent object of source, then it will give the
    datagriditem(row) in which that dropdownlist was changed. From dataitem you
    can do whatever you want, but you cant get the rowindex directly. For
    example, check out this event handler for dropdownlist in which i am
    changing a hiddenitem value in that row when dropdownlist value is changed
    in that row

    Sub DG2DropDownListSelect(ByVal sender As Object, ByVal e As
    System.EventArgs)

    Dim oDropDownList As DropDownList

    Dim oGenControl As System.Web.UI.HtmlControls.HtmlInputHidden

    oDropDownList = CType(sender, DropDownList)

    oGenControl = oDropDownList.Parent.FindControl("DataGrid2RecordState")

    oGenControl.Value = "Changed"


    End Sub


    i hope you understand this approach...

    --
    Saravana
    Microsoft India Community Star,
    MCAD,SE,SD,DBA.


    "Dominic" <> wrote in message
    news:...
    > Thanks again for your response. I'm sorry if I didn't put my question
    > more clearly. Let me try to understand your approach first. My
    > understanding is that even though there may be multiple rows (each
    > contains one one dropdownlist control), there is only one event
    > handler DG1DropDownListSelect for all of the dropdownlist controls. Is
    > that right? If this correct, I expect that there must be a way that
    > the event handler can figure out which row it corresponds to. For
    > example, below is the event handler.
    >
    >
    > private void DG1DropDownListSelect(object sender, System.EventArgs e)
    > {
    > rowIndex = e.????
    > }
    >
    > Thanks again
    > Dominic
    > "Saravana" <> wrote in message

    news:<>...
    > > when DG1Dropdownlist is called, it corresponds to the row in which you

    have
    > > changed dropdownlist value.
    > >
    > > --
    > > Saravana
    > > Microsoft India Community Star,
    > > MCAD,SE,SD,DBA.
    > >
    > >
    > > "Dominic" <> wrote in message
    > > news:...
    > > > Thank you for your reply. But I still don't quite get it.
    > > >
    > > > Since there are multiple rows in a datagrid, there will be multiple
    > > > Dropdownlists (each one corresponds to one row). So, when
    > > > DG1DropDownList is called, which row does it correspond to this event?
    > > >
    > > > Please also see my second question regarding ItemDataBound. This is a
    > > > similar question to the first one. Instead of catching the
    > > > SelectedItemChanged event from a dropdownlist inside a row of a
    > > > datagrid, this is a question about how to catch a ItemDataBound event
    > > > from a datagrid inside a row of a datagrid.
    > > >
    > > > Thanks
    > > > Dominic
    > > > "Saravana" <> wrote in message

    > > news:<>...
    > > > > You can add event handler to dropdownlist like this,
    > > > > <asp:TemplateColumn headertext="Month">
    > > > > <ItemTemplate>
    > > > > <asp:DropDownList id="MonthACT" datavaluefield="Value"
    > > > > datatextfield="Name" DataSource="<%#oMonthDataSet%>" runat="server"
    > > > > OnSelectedIndexChanged="DG1DropDownListSelect" >
    > > > > </asp:DropDownList>
    > > > > </ItemTemplate>
    > > > > </asp:TemplateColumn>
    > > > > --
    > > > > Saravana
    > > > > Microsoft India Community Star,
    > > > > MCAD,SE,SD,DBA.
    > > > >
    > > > >
    > > > > "Dominic" <> wrote in message
    > > > > news:...
    > > > > > Hi guys,
    > > > > >
    > > > > > I'm not sure if this question belongs to FAQ, but I couldn't find

    a
    > > > > > concrete answer.
    > > > > >
    > > > > > I created a Datagrid control using ItemTemplate, but it's NOT a
    > > > > > in-place editing datagrid. One of the columns of the data grid
    > > > > > contains a DropDownlist. I managed to create this datagrid control

    as
    > > > > > follows.
    > > > > >
    > > > > > <asp:datagrid RunAt="server" id="dgItem" DataKeyField="ItemId"...
    > > > > > <columns>
    > > > > > <asp:TemplateColumn HeaderText="Category">
    > > > > > <ItemTemplate>
    > > > > > <asp:DropDownList RunAt="server" ID="ddlCategory" />
    > > > > > .....
    > > > > >
    > > > > > The code-behind source looks like
    > > > > >
    > > > > > private void Page_Load(object sender, System.EventArgs e)
    > > > > > {
    > > > > > if (!IsPostBack)
    > > > > > {
    > > > > > dgTest.DataSource = GetItemList();
    > > > > > dgTest.DataBind();
    > > > > > }
    > > > > > }
    > > > > >
    > > > > > private void OnItemDataBound(object sender, DataGridItemEventArgs

    e)
    > > > > > {
    > > > > > if (e.Item.ItemType == ListItemType.Item)
    > > > > > {
    > > > > > int itemId = (int)dgItem.DataKeys[e.Item.ItemIndex];
    > > > > >
    > > > > > DropDownList ddlCategory =
    > > > > > (DropDownList)e.Item.FindControl("ddlCategory");
    > > > > > ddlCategory .DataSource = GetCateoryList();
    > > > > > ddlCategory .DataBind();
    > > > > > }
    > > > > > }
    > > > > >
    > > > > > This approach works quite well to populate the drop-down list and

    the
    > > > > > grid itself. However, I have two questions here.
    > > > > >
    > > > > > 1. How can I catch the "SelectedItemChanged" event fired from the
    > > > > > drop-down-list "ddlCategory"?
    > > > > >
    > > > > > One of the previous posting mentioned that we can catch

    ControlAdded
    > > > > > event and add the SelectedItemChanged event there....
    > > > > >
    > > > > > private void dataGrid1_ControlAdded(object sender,

    ControlEventArgs e)
    > > > > > {
    > > > > > if(e.Control.GetType == typeof(ComboBox))
    > > > > > ((DropDownList)e.Control).SelectedIndexChanged += new
    > > > > > System.EventHandler(dropDownList_SelectedIndexChanged);
    > > > > > }
    > > > > >
    > > > > > Unfortunately, ControlAdded event is only for WinForms, not

    WebForms
    > > > > > (Right??)
    > > > > >
    > > > > > A possible alternative is to use event bubbling. However, this
    > > > > > involves subclassing the dropdownlist to raise bubble event.

    Right?
    > > > > >
    > > > > > Other than the event bubbling, is there any other easier method?

    Some
    > > > > > codes for illustration will be much appreciated.
    > > > > >
    > > > > > 2. The above datagrid items actually contains subitems. It is
    > > > > > something like
    > > > > >
    > > > > > HeaderA HeaderB HeaderC
    > > > > > Item1A Item1B Item1C
    > > > > > Item11A Item11B Item11C
    > > > > > Item12A Item12B Item12C
    > > > > > Item2A Item2B Item2C
    > > > > > Item21A Item22B Item22C
    > > > > >
    > > > > > where Item11A and Item12A is the sub-item of Item1A, etc.
    > > > > >
    > > > > > I implemented the above as two levels of datagrid. Item1 and Item2
    > > > > > belong to datagrid of level1, while Item11, 12, 21, etc are

    level2. As
    > > > > > illustrated in the first part of my question, I can easily catch

    the
    > > > > > ItemDataBound event of level1 datagrid. But, how can I catch the
    > > > > > ItemDataBound of level2 data grid?
    > > > > >
    > > > > > Thanks again
    > > > > > Dominic
    Saravana, Jul 4, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Shiva
    Replies:
    3
    Views:
    32,083
    leoykl
    Jun 14, 2012
  2. Shiva
    Replies:
    0
    Views:
    448
    Shiva
    Nov 17, 2004
  3. Arthur Dent
    Replies:
    0
    Views:
    545
    Arthur Dent
    Dec 23, 2004
  4. The Colonel
    Replies:
    0
    Views:
    570
    The Colonel
    Jan 24, 2005
  5. Dominic
    Replies:
    2
    Views:
    207
    Saravana
    Jul 4, 2003
Loading...

Share This Page