Click here to Skip to main content
15,883,870 members
Articles / Web Development / ASP.NET
Article

Multiple Column Dropdownlist for the ASP.NET DataGrid

Rate me:
Please Sign up or sign in to vote.
4.46/5 (43 votes)
1 Jun 20053 min read 423.7K   6.7K   140   52
An article on multiple column dropdownlists for the ASP.NET DataGrid.

Image 1

Image showing when a control is added to EditItemTemplate.

Introduction

Based on my previous control "Multiple Column DropDownList for ASP.NET", I received many emails asking for the same control to be used in the DataGrid for web applications. Here we go.. This control can be used as the regular MS DropDownList in the DataGrid and also as a regular dropdownlist. It has all the properties, like DataTextField, DataValueField, DataSource, SelectedIndex etc. The download file contains the samples both in VB.NET and C#. In this sample, I have used the Northwind database of SQL Server.

Building the Control

The following web server controls were used to build this control:

  1. TextBox
  2. Label
  3. Panel

Adding the Control to DataGrid

This control can be added either to the ItemTemplate or EditItemTemplate of the DataGrid through Property Builder.

  1. Drop a DataGrid onto your webform.
  2. Right click the DataGrid and select Property Builder and select Columns.
  3. A bound column may or may not be required, I have shown samples of both.
  4. Add two bound columns, set the header and the text field: SupplierID and CompanyName.
  5. Add one Template Column and set the header text to Products.
  6. Uncheck the checkbox "Create columns automatically at run time".
  7. Click OK.
  8. Now right click the DataGrid and select Edit Template, now either you could add this in ItemTemplate or EditItemTemplate.
  9. Set the properties of the control, like CssClass, GridRowcolor, DataTextfield etc.
  10. Close the template box.

Points to Note:

The DataValueField property is readonly, which means you cannot set the value, so make sure that in your query, the row value field is always the first column, which will not be displayed in the dropdown. The DataTextField returns an integer value, so while setting this property, type the column position from your "SELECT" statement, which needs to get displayed in the textbox. (For e.g., to display the second column "LastName" in the textbox, set DataValueField =2.) If your DataGrid is inside the "Table/Div/Span", then make sure the "Position" attribute in the "Style" property is set to absolute, and if not used in any of these tags, then set the DataGrid's Style property.

Make sure that the HorizontalAlign and VerticalAlign properties of the ItemStyle of your DataGrid is set as shown, else the control may not be positioned properly inside the DataGrid. E.g.:

HTML
<ItemStyle HorizontalAlign="Left" VerticalAlign="Top"></ItemStyle>

See the code below. E.g., to populate the dropdown with FirstName and LastName:

SQL
SELECT Employeeid,Firstname,LastName
From Employees

Now if added in the EditItemTemplate (based on your requirement, bounded column may or may not be required), in my sample I used two <BoundColumn>s:

ASP.NET
<ASP:DATAGRID id="jskDataGrid" runat="server" 
    Font-Size="8pt" HeaderStyle-ForeColor="Tan" 
    AutoGenerateColumns="False" HeaderStyle-BackColor="Maroon" 
    HeaderStyle-Font-Bold="True" Font-Name="Verdana" ShowFooter="false" 
    BorderColor="Tan" DataKeyField="SupplierID" 
    OnUpdateCommand="MyDataGrid_Update" OnCancelCommand="MyDataGrid_Cancel" 
    OnEditCommand="MyDataGrid_Edit" CellSpacing="0" CellPadding="3" 
    Width="800" Style="Position:absolute;Top:0px;Left:0px">

  <HeaderStyle Font-Bold="True" ForeColor="Tan" BackColor="Maroon"></HeaderStyle>
  <Columns>
        <asp:EditCommandColumn ButtonType="LinkButton" 
             UpdateText="Update" CancelText="Cancel" EditText="Edit">
          <ItemStyle VerticalAlign="Top"></ItemStyle>
        </asp:EditCommandColumn>
        <asp:BoundColumn DataField="SupplierID" 
              ReadOnly="True" HeaderText="Supplier ID">
          <ItemStyle Wrap="False" VerticalAlign="Top"></ItemStyle>
        </asp:BoundColumn>
        <asp:BoundColumn DataField="CompanyName" 
              ReadOnly="True" HeaderText="Company Name">
          <ItemStyle Wrap="False" VerticalAlign="Top"></ItemStyle>
        </asp:BoundColumn>
        <asp:TemplateColumn HeaderText="Products">
    <ItemStyle HorizontalAlign="Left" VerticalAlign="Top"></ItemStyle>
        <!-- Set these two properties as shown-->
        <%# DataBinder.Eval(Container.DataItem, "ProductName") %>
          </ItemTemplate>
          <EditItemTemplate>
            <TABLE cellSpacing="0" cellPadding="0" width="100%" border="0">
              <TR>
                <TD>
                  <jsk:mcDDList id="McDDList1" 
                    Width="200" 
                    SelectedIndex='<%# DataBinder.Eval(Container.DataItem, 
                                                          "ProductID") %>' 
                    cssClass="cStyle" Runat="server" 
                    DataSource="<%# PopulateDDList()%>"
                    DataTextField="2">
                  </jsk:mcDDList>
                </TD>
              </TR>
            </TABLE>
          </EditItemTemplate>
        </asp:TemplateColumn>
      </Columns>
</ASP:DATAGRID>

If you want to show the existing values then add the "SelectedIndex" property.

Properties

  • DataTextField - The field to be shown in the Ccontrol.
  • DataValueField - Read only property (value field to identify the row - default is first column {0}).
  • DataSource - DataSet to populate the dropdown.
  • DDTextboxReadonly - If false, can type your own text.
  • GridRowColor - OnMouseMove changes the row color.
  • GridTextColor - OnMouseMove changes the text color.
  • ListBoxHeight - Sets the height of the dropdown.
  • ReturnsValue - To get the text, set it to false. To get the value, set it to true, while updating.
  • SelectedIndex - If set, shows the existing value in the dropdown.

Populating the DataGrid

C#
private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    if (! IsPostBack)
    {
        BindDataGrid();
    }
}

protected void BindDataGrid()
{
    string sqlStr = "SELECT S.CompanyName, S.SupplierID," +
                    " P.ProductName, P.ProductID " +
                    "from Suppliers S inner join Products P " +
                    "on S.SupplierID = P.SupplierID ";
    sqlDa = new SqlDataAdapter(sqlStr, SqlCon);
    ds = new DataSet();
    sqlDa.Fill(ds, "Prod");
    jskDataGrid.DataSource = ds.Tables["Prod"];
    jskDataGrid.DataBind();
}

Populating the DropDownList

C#
public DataSet PopulateDDList()
{
    string sqlString = " select ProductID, ProductName, " +
                       "CategoryName as Name,UnitPrice as Price " +
                       "from Products p inner join Categories c " +
                       "on p.categoryid = c.categoryid ";
    SqlDataAdapter ad = new SqlDataAdapter(sqlString,SqlCon);
    DataSet ds = new DataSet();
    ad.Fill(ds,"Categories");
    return ds;
}

Codes to Edit/Update/Cancel

C#
protected void jskDataGrid_Edit(object sender, DataGridCommandEventArgs e)
{
    jskDataGrid.EditItemIndex = e.Item.ItemIndex;
    BindDataGrid();
}

protected void jskDataGrid_Cancel(object sender, DataGridCommandEventArgs e)
{
    jskDataGrid.EditItemIndex = -1;
    BindDataGrid();
}

protected void jskDataGrid_Update(object sender, DataGridCommandEventArgs e)
{
    try
    {
        string itemValue;
        string itemText;

        // To get the DataValueField of the DropDown
        ((ddList.mcDDList)e.Item.FindControl("McDDList1")).ReturnsValue = true;
        itemValue =
          ((ddList.mcDDList)e.Item.FindControl("McDDList1")).Text.ToString();

        // To get the DataTextField of the Dropdown
        ((ddList.mcDDList)e.Item.FindControl("McDDList1")).ReturnsValue = false;
        itemText =
          ((ddList.mcDDList)e.Item.FindControl("McDDList1")).Text.ToString();

        //write your update query
        //update table set col1 = itemtext where col2 = itemvalue
        //Execute the Query

        jskDataGrid.EditItemIndex = -1;
        BindDataGrid();
    }
    catch(Exception ex)
    {
        Response.Write(ex.Message);
    }
    finally
    {
        /*Close your Connection */
    }
}

Points of Interest

The control is built mostly using JavaScript. There is a property "DDTextboxReadonly", this property is used to enable/disable the textbox, means either you could select the text from the list or you could type.

Using the Intellisense

As in my previous article, I showed how to use the Intellisense. The zip file contains the .xsd, copy it to the following location:

  • C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml

and in the <body> tag of your aspx page, add the following code:

HTML
<body MS_POSITIONING="GridLayout"
  xmlns:jsk="urn:http://schemas.ksjControls.com/DGDD/ASPNET">

Image 2

History

  • ver. (1.0) - Initial version (posted 12th May 2005)
  • ver. (1.1) - New property has been added, ListBoxHeight to adjust the height of the dropdown.
  • ver. (1.2) - Control does not expand the DataGrid rows.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
I'm a .Net Programmer/Web Developer, mostly working on ASP.Net C# and VB.Net,Oracle,SQL server 2000.

Comments and Discussions

 
GeneralRe: ASP.NET 2.0 Version Pin
Member 427698816-Jun-09 9:15
Member 427698816-Jun-09 9:15 
GeneralDon't support all the dropdownlist Event handling Pin
begreat21-Dec-05 0:23
begreat21-Dec-05 0:23 
QuestionWould you kindly post the Source For this Control? Pin
kennster28-Sep-05 5:47
kennster28-Sep-05 5:47 
QuestionRendering of the control? Pin
Koki4-Aug-05 12:54
Koki4-Aug-05 12:54 
AnswerRe: Rendering of the control? Pin
Koki4-Aug-05 13:14
Koki4-Aug-05 13:14 
AnswerRe: Rendering of the control? Pin
Jay Kulaindevelu5-Aug-05 6:56
Jay Kulaindevelu5-Aug-05 6:56 
GeneralBlank section on top of the page Pin
ddanse26-Jul-05 21:54
ddanse26-Jul-05 21:54 
GeneralRe: Blank section on top of the page Pin
Jay Kulaindevelu27-Jul-05 2:28
Jay Kulaindevelu27-Jul-05 2:28 
Hi,

Could you please send me the portion of the code where you are using the dropdown in the grid.

Thanks
Jay
QuestionHow did you expose DataSource in the HTML view?? Pin
jachyuen22-Jul-05 0:45
jachyuen22-Jul-05 0:45 
Generalabout cStyle Pin
suro61520-Jul-05 17:57
suro61520-Jul-05 17:57 
GeneralRe: about cStyle Pin
Jay Kulaindevelu21-Jul-05 2:49
Jay Kulaindevelu21-Jul-05 2:49 
GeneralNot working Pin
ken_in_oz17-Jul-05 20:33
ken_in_oz17-Jul-05 20:33 
GeneralRe: Not working Pin
Jay Kulaindevelu18-Jul-05 4:11
Jay Kulaindevelu18-Jul-05 4:11 
QuestionWhere to get new version? Pin
kurry31-May-05 19:14
kurry31-May-05 19:14 
AnswerRe: Where to get new version? Pin
Jay Kulaindevelu1-Jun-05 1:50
Jay Kulaindevelu1-Jun-05 1:50 
Generalcould you share the source code of ddList.dll Pin
thienanmon26-May-05 23:28
thienanmon26-May-05 23:28 
QuestionIs there any way for it to work like normal dropdownlist ? Pin
pkaeluri19-May-05 3:12
pkaeluri19-May-05 3:12 
AnswerRe: Is there any way for it to work like normal dropdownlist ? Pin
Jay Kulaindevelu19-May-05 3:36
Jay Kulaindevelu19-May-05 3:36 
AnswerRe: Is there any way for it to work like normal dropdownlist ? Pin
Collin Parker22-May-05 16:53
Collin Parker22-May-05 16:53 
Generalthe Enable of the controls is not work Pin
evon_adeeb17-May-05 4:30
evon_adeeb17-May-05 4:30 
GeneralRe: the Enable of the controls is not work Pin
Jay Kulaindevelu17-May-05 4:39
Jay Kulaindevelu17-May-05 4:39 
Questioncould you share the source code of ddList.dll? Pin
tim73di15-May-05 3:40
tim73di15-May-05 3:40 
Generalproblem Pin
Simone Busoli13-May-05 1:16
Simone Busoli13-May-05 1:16 
GeneralRe: problem Pin
Jay Kulaindevelu13-May-05 2:52
Jay Kulaindevelu13-May-05 2:52 
GeneralRe: problem Pin
Simone Busoli13-May-05 2:56
Simone Busoli13-May-05 2:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.