Question

ASP.NET: Retrieving DropDownList in Gridview RowUpdating event

Asked by: BigBadJock

I have a problem, with GridView and TemplateFields. We have an application which creates maintenance screens based on an xml configuration file. The xml describes which fields to show, etc. This all works

However, we have a new requirement to add DropDownLists to some columns to enforce data integrity.

I have therefore added the relevant xml, and when creating the grid, create the column as a TemplateField  and the EditItem as a DropDownList with its own SqlDataSource.

So far so good, this all works, the grid is displayed, the DropDownList appears, filled with the correct data, shows the correct initial item and lets the user select another.

Here is where I have problems. The when trying to get the value from the DropDownList in the RowUpdating event, I cant find it. Ive used FindControl to no avail. I create a RecursiveFindControl method that ran through every control on the page, and it cant find it. Ive tried peeking in the cell controls in the debugger and its just not there.

Can anyone help? Ive duplicated it in a simpler test page, with a test database.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WareHouseAdmin.test2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="True" onrowcancelingedit="GridView1_RowCancelingEdit" onrowediting="GridView1_RowEditing" onrowupdated="GridView1_RowUpdated" onrowupdating="GridView1_RowUpdating" DataSourceID="SqlDataSource1">
        </asp:GridView>
    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" onupdated="SqlDataSource1_Updated" onupdating="SqlDataSource1_Updating"></asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server"></asp:SqlDataSource>
    </form>
</body>
</html>
 
 
-----------------------------
 
 
 
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace WareHouseAdmin
{
    public partial class test2 : System.Web.UI.Page
    {
        
        protected void Page_Init(object sender, EventArgs e)
        {
            SetupData();
        }
 
        protected void Page_Load(object sender, EventArgs e)
        {
            BuildGrid();
            if (!IsPostBack)
            {
                BindGrid();
            }
        }
 
        private void SetupData()
        {
            string connection = ConfigurationManager.ConnectionStrings["warehouseConnectionString"].ConnectionString;
            this.SqlDataSource1.ConnectionString = connection;
            this.SqlDataSource1.SelectCommand = "select * from songs";
            this.SqlDataSource1.UpdateCommand = "UPDATE [Songs] SET [AlbumId]=@albumId, [ArtistId]=@artistId, [SongTitle] = @SongTitle, [notes] = @notes WHERE [ID] = @ID";
            this.SqlDataSource1.UpdateParameters.Clear();
 
            this.SqlDataSource2.ConnectionString = connection;
            this.SqlDataSource2.SelectCommand = "select * from albums";
        }
 
        private void BindGrid()
        {
            this.GridView1.DataBind();
        }
 
        private void BuildGrid()
        {
            this.GridView1.Columns.Clear();
            AddColumn("id", "id", "Int32");
            //AddColumn("Album", "albumId", "Int32");
            AddDropDownColumn("Album", "albumId","id","name",SqlDataSource2);
            AddColumn("Artist", "artistId", "Int32");
            AddColumn("Title", "songTitle","String");
            AddColumn("Notes", "notes", "String");
 
            this.GridView1.DataKeyNames = new string[] { "id" };
 
        }
 
 
        private void AddColumn(string header, string name, string dataType)
        {
            BoundField bf = new BoundField();
            bf.HeaderText = header;
            bf.DataField = name;
            bf.SortExpression = name;
            bf.ReadOnly = false;
            bf.HtmlEncode = true;
            this.GridView1.Columns.Add(bf);
 
 
            TypeCode tc = (TypeCode)Enum.Parse(typeof(TypeCode), dataType);
            Parameter p = new Parameter(name, tc);
            this.SqlDataSource1.UpdateParameters.Add(p);
 
        }
 
        private void AddDropDownColumn(string header, string name, string valueColumn, string displayColumn, SqlDataSource dataSource)
        {
            TemplateField tf = new TemplateField();
            tf.HeaderText = header;
            tf.ItemTemplate = new DDLTemplate(ListItemType.Item, name, null, null, null);
            tf.EditItemTemplate = new DDLTemplate(ListItemType.EditItem, name, valueColumn, displayColumn, dataSource );
            this.GridView1.Columns.Add(tf);
 
            TypeCode tc = (TypeCode)Enum.Parse(typeof(TypeCode), "Int32");
            Parameter p = new Parameter(name, tc);
            this.SqlDataSource1.UpdateParameters.Add(p);
 
        }
 
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.GridView1.EditIndex = e.NewEditIndex;
            BindGrid();
        }
 
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            GridViewRow row = this.GridView1.Rows[e.RowIndex];
            Control foundControl = RecursiveFindControl(row, "GridView1$ctl07$albumId_ddl");
            if (foundControl != null)
            {
                DropDownList ddl = (DropDownList)foundControl;
                string val = ddl.SelectedValue;
                e.NewValues.Add("albumId", val);
            }
            BindGrid();
        }
 
        private Control RecursiveFindControl(Control root, string id)
        {
            if (root.ID != null)
            {
                if (root.ID.EndsWith(id))
                {
                    return root;
                }
            }
            if (root.ClientID != null)
            {
                if (root.ClientID.EndsWith(id))
                {
                    return root;
                }
            }
            foreach (Control subControl in root.Controls)
            {
                Control foundControl = RecursiveFindControl(subControl, id);
                if (foundControl != null)
                {
                    return foundControl;
                }
            }
            return null;
        }
 
        protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
        {
        }
 
        protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;
            BindGrid();
        }
 
        protected void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
            }
        }
 
        protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
        {
            System.Console.WriteLine(e.Command);
 
        }
 
    }
 
    public class DDLTemplate : System.Web.UI.Page, ITemplate
    {
        ListItemType templateType;
        string column;
        string valueColumn;
        string displayColumn;
        SqlDataSource dataSource;
 
        public DDLTemplate(ListItemType type, string column, string valueColumn, string displayColumn, SqlDataSource dataSource)
        {
            this.templateType = type;
            this.column = column;
            this.valueColumn = valueColumn;
            this.displayColumn = displayColumn;
            this.dataSource = dataSource;
        }
 
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {
                case ListItemType.Header:
                    break;
 
                case ListItemType.Item:
                    Literal lc = new Literal();
                    lc.DataBinding += new EventHandler(lc_DataBinding);
                    container.Controls.Add(lc);
                    break;
 
                case ListItemType.EditItem:
                    DropDownList ddl = new DropDownList();
                    ddl.ID = "albumId_ddl";
                    ddl.DataValueField = this.valueColumn;
                    ddl.DataTextField = this.displayColumn;
                    ddl.DataSource = this.dataSource;
                    ddl.DataBinding += new EventHandler(ddl_DataBinding);
                    ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
                    container.Controls.Add(ddl);
                    break;
 
                case ListItemType.Footer:
                    break;
 
            }
        }
 
        void ddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
            Session["albumId_val"] = ddl.SelectedValue;
        }
 
        void lc_DataBinding(object sender, EventArgs e)
        {
            Literal lc = (Literal)sender;
            GridViewRow row = (GridViewRow)lc.NamingContainer;
            string text = DataBinder.Eval(row.DataItem, this.column).ToString();
            lc.Text = text;
        }
 
        void ddl_DataBinding(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
            GridViewRow row = (GridViewRow)ddl.NamingContainer;
            string id = DataBinder.Eval(row.DataItem, column).ToString();
            ddl.SelectedValue = id;
            ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
 
        }
 
    }
 
}

                                  
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:

Select allOpen in new window

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-03-06 at 05:29:56ID24205485
Tags

ASP.NET; .Net

,

C#; GridView; DropDownList

Topics

Programming for ASP.NET

,

C# Programming Language

,

.NET Framework 3.x versions

Participating Experts
2
Points
0
Comments
27

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. asp.net gridview
    I am currently using javascript, asp.net and c# in my application. Originally i created a table and got values from that table in javascript and c#. My problem is that instead of using a table i will need to use a gridview with paging (to minimize the height of the data view...
  2. Gridview Cells Web Controls
    How can a dropdown and a calendar control be added to cells of a gridview? Thanks.
  3. ASP.NET dropdownlist refresh gridview
    Does someone have an example of how a dropdownlist selection can populate the content of a gridview based on the selection? I have a sqldatasource that populates the dropdownlist when the form loads and I'd like to fire off the SelectCommand for the second data source which ...
  4. DropDownList pre-selection on GridView Edit
    I have a GridView in which one column normally contains a Label. To insert a new row into the Gridview (well, technically, the database the GridView displays data from), the value for that column is chosen from a DropDownList bound to an XML file (at runtime in the C# code-be...
  5. Gridview
    hi experts, iam displaying gridview and in that some times iam displaying only 1 or 2 records which increasing the gridview cell sizes i mean if only two records are there then the size of cell is becoming big and if there are atleast min 10 records then gridview is looking...
  6. Dropdownlist in Asp.net Gridview
    I have a webform with a gridview and I'm using sqldatasources to populate dropdownlists so that the names entered in the database when the gridview is edited will all be uniform. I hope that makes sense - it sounded good it my head :) The problem is little but it makes me cu...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: davrob60Posted on 2009-03-06 at 06:31:03ID: 23816835

 

by: BigBadJockPosted on 2009-03-06 at 06:38:06ID: 23816916

Thanks, but I have tried using e.RowIndex and EditIndex. I have also tried doing a recursive check on the Grid and even the whole Page, but still cannot find the DropDownList.

 

by: davrob60Posted on 2009-03-06 at 06:43:20ID: 23816977

if you are trying to find it using "GridView1$ctl07$albumId_ddl", you wont find it. but if you are using "albumId_ddl" you will find it as you are in the correct container.

 

by: BigBadJockPosted on 2009-03-06 at 06:48:38ID: 23817030

Sorry, that was test code I left in. I have been searching for albumId_ddl, but after checking the html source, I thought I'd try the generated name as well. Still no luck.

 

by: ragi0017Posted on 2009-03-06 at 06:50:00ID: 23817043

did you try the code ro rowindex as suggested above and in the line below taken from the below mentioned link
drdList = (DropDownList)(GridView1.Rows[ e.RowIndex ].Cells[1].FindControl( "DropDownList1" ));
http://programming.top54u.com/post/Edit-Update-GridView-DropDownList-SelectedValue.aspx

 

by: davrob60Posted on 2009-03-06 at 06:55:34ID: 23817087

did you try this?

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
                        DropDownList ddl = (DropDownList)(GridView1.Rows[ e.RowIndex ].Cells[1].FindControl( "albumId_ddl" ));
            if (ddl != null)
            {
                                string val = ddl.SelectedValue;
                                e.NewValues.Add("albumId", val);
            }
            BindGrid();
        }
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

Select allOpen in new window

 

by: davrob60Posted on 2009-03-06 at 06:58:16ID: 23817110

sorry i think you dont need the "Cells[1]" part

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
                        DropDownList ddl = (DropDownList)(GridView1.Rows[ e.RowIndex ].FindControl( "albumId_ddl" ));
            if (ddl != null)
            {
                                string val = ddl.SelectedValue;
                                e.NewValues.Add("albumId", val);
            }
            BindGrid();
        }

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

Select allOpen in new window

 

by: BigBadJockPosted on 2009-03-06 at 07:02:43ID: 23817151

Yes, I am trying that, returns null.


            DropDownList ddl1 = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("albumID_ddl");

                                              
1:
2:

Select allOpen in new window

 

by: ragi0017Posted on 2009-03-06 at 07:04:02ID: 23817168

did you try my suggestion
drdList = (DropDownList)(GridView1.Rows[ e.RowIndex ].Cells[1].FindControl( "DropDownList1" ));

 

by: davrob60Posted on 2009-03-06 at 07:06:16ID: 23817193

OK than you need that column thing. if i<m correct, you ddl is in column 2, so it should be

DropDownList ddl = (DropDownList)(GridView1.Rows[ e.RowIndex ].Cells[1].FindControl( "albumId_ddl" ));

 

by: davrob60Posted on 2009-03-06 at 07:07:36ID: 23817210

yes, you where right ragi0017, but DropDownList1 = albumId_ddl for him

 

by: ragi0017Posted on 2009-03-06 at 07:09:08ID: 23817228

so what .... i think that the aurhor can understand that much.... i just want to give the logic to fix the problem which i think i have

 

by: davrob60Posted on 2009-03-06 at 07:17:09ID: 23817326

ragi0017, I said you where right, but at the point we are in this question, I just want to be sure the author test it with the right code. I`m not telling you you or the author diden`t undrestand this.

 

by: BigBadJockPosted on 2009-03-06 at 07:17:38ID: 23817335

I have tried that. No Luck.

I've just drilled down into the cell, in debug, and the TemplateField is showing the EditItemTemplate as null. In fact so is the ItemTemplate.

 

by: davrob60Posted on 2009-03-06 at 07:26:26ID: 23817432


well, EditItemTemplate is null because you set it dynamicly, it`s not using a EditItemTemplate.
What you should check is the content of GridView1.Rows[ e.RowIndex ]

i now suspect it<s has somthing to do with the BindGrid(); call, it i correctly understant it, the grid is constructed (and the dropdown) at this point. what if you call the BindGrid BEFORE finding the ddl?


 

by: davrob60Posted on 2009-03-06 at 07:28:49ID: 23817458

Sorry, you have BuildGrid() call on Page_Load. it should not be this...

any idea ragi0017?

 

by: BigBadJockPosted on 2009-03-06 at 07:46:09ID: 23817688

If I call the BindGrid() at the start of RowUpdating then the DropDownList is available, but the selectedValue is lost.

From what was said in the other comment, should I be calling the BuildGrid from somewhere other than Page_Load()?

 

by: davrob60Posted on 2009-03-06 at 07:55:01ID: 23817787

No i dont think the page load is the problem, but we are getting closer to the source of the problem. i<m surprise the BindGrid() make the DropDownList "appear".

What happen if you leave the BindGrid(); at the end but call BuildGrid(); before  finding the ddl? I worry it will still dont have your new value, but let`s try.

The other solution is to drop that dynamic control creation and uses standard item and edit templates (declaratively in the aspx file)

 

by: BigBadJockPosted on 2009-03-06 at 08:11:06ID: 23817971

With just BuildGrid() called, then the ddl is null.

Unfortunatley, I can't drop the dynamic creation, as this app is used to maintain three different systems, and being defined by an XML configuration file, means that the page can be used to maintain multiple tables.

 

by: davrob60Posted on 2009-03-06 at 08:17:23ID: 23818054

I jsut noticed this code.

void ddl_SelectedIndexChanged(object sender, EventArgs e)
       {
           DropDownList ddl = (DropDownList)sender;
           Session["albumId_val"] = ddl.SelectedValue;
       }

so i guess you are doing something like this has a workaround.

string val = Session["albumId_val"]

 e.NewValues.Add("albumId", val);

if not, it could be a solution, since we cannot find the control right now...

 

by: BigBadJockPosted on 2009-03-06 at 08:20:17ID: 23818086

I had tried that but the SelectedIndexChanged was never called. I haven't investigated why not yet.

 

by: davrob60Posted on 2009-03-06 at 08:30:12ID: 23818200

That is wonderfull... (sarcasm)

I was thinking of retriving the ddl value trough the viewstate and i found this.

http://msdn.microsoft.com/en-us/library/ms972976.aspx

So i got another idea, what if you call the BuildGrid in the page init instead of page load?

 

by: BigBadJockPosted on 2009-03-11 at 08:57:42ID: 23858815

After investigation, it looks like the SelectedIndexChanged is not called because on the postback with update, the DropDownList doesn't exists, therefore the event doesn't exist.

As a workaround, I can add a javascript onchange event to the DropDownList which is called when the value changes. Is there a way I can pass this value back to the server and use it?

 

by: davrob60Posted on 2009-03-11 at 09:05:25ID: 23858917

Asp.net generate a javascript function with the name "__doPostBack". this is the function that is called by all control when sending information to the server. So, you could use it in the javascript onchange event.

http://aspalliance.com/895_Understanding_the_JavaScript___doPostBack_Function.all

 

by: BigBadJockPosted on 2009-03-12 at 04:30:00ID: 23866991

I have it working. I removed the isPostback check around the bindgrid on the pageLoad. Here is the working code.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WareHouseAdmin.test2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="True" onrowcancelingedit="GridView1_RowCancelingEdit" onrowediting="GridView1_RowEditing" onrowupdated="GridView1_RowUpdated" onrowupdating="GridView1_RowUpdating" DataSourceID="SqlDataSource1" >
        </asp:GridView>
    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" onupdated="SqlDataSource1_Updated" onupdating="SqlDataSource1_Updating"></asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server"></asp:SqlDataSource>
    </form>
</body>
</html>
 
----------------------
 
 
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
 
namespace WareHouseAdmin
{
    public partial class test2 : System.Web.UI.Page
    {
        
        protected void Page_Init(object sender, EventArgs e)
        {
            SetupData();
        }
 
        protected void Page_Load(object sender, EventArgs e)
        {
            BuildGrid();
            BindGrid();
        }
 
        private void SetupData()
        {
            string connection = ConfigurationManager.ConnectionStrings["warehouseConnectionString"].ConnectionString;
            this.SqlDataSource1.ConnectionString = connection;
            this.SqlDataSource1.SelectCommand = "select s.*, ar.name as artist, al.name as album from songs s,artists ar,albums al where ar.id = s.artistId and al.id = s.albumId";
            this.SqlDataSource1.UpdateCommand = "UPDATE [Songs] SET [AlbumId]=@albumId, [ArtistId]=@artistId, [SongTitle] = @SongTitle, [notes] = @notes WHERE [ID] = @ID";
            this.SqlDataSource1.UpdateParameters.Clear();
 
            this.SqlDataSource2.ConnectionString = connection;
            this.SqlDataSource2.SelectCommand = "select * from albums";
        }
 
        private void BindGrid()
        {
            this.GridView1.DataBind();
        }
 
        private void BuildGrid()
        {
            this.GridView1.Columns.Clear();
            this.GridView1.DataKeyNames = new string[] { "id" };
 
            AddColumn("id", "id", "Int32");
            //AddColumn("Album", "albumId", "Int32");
            AddDropDownColumn("Album", "albumId","id","name",SqlDataSource2);
            AddColumn("Artist", "artistId", "Int32");
            AddColumn("Title", "songTitle","String");
            AddColumn("Notes", "notes", "String");
 
 
        }
 
 
        private void AddColumn(string header, string name, string dataType)
        {
            BoundField bf = new BoundField();
            bf.HeaderText = header;
            bf.DataField = name;
            bf.SortExpression = name;
            bf.ReadOnly = false;
            bf.HtmlEncode = true;
            this.GridView1.Columns.Add(bf);
 
 
            TypeCode tc = (TypeCode)Enum.Parse(typeof(TypeCode), dataType);
            Parameter p = new Parameter(name, tc);
            this.SqlDataSource1.UpdateParameters.Add(p);
 
        }
 
        private void AddDropDownColumn(string header, string name, string valueColumn, string displayColumn, SqlDataSource dataSource)
        {
            TemplateField tf = new TemplateField();
            tf.HeaderText = header;
            tf.ItemTemplate = new DDLTemplate(ListItemType.Item, name, null, null, null);
            tf.EditItemTemplate = new DDLTemplate(ListItemType.EditItem, name, valueColumn, displayColumn, dataSource );
            this.GridView1.Columns.Add(tf);
 
            TypeCode tc = (TypeCode)Enum.Parse(typeof(TypeCode), "Int32");
            Parameter p = new Parameter(name, tc);
            this.SqlDataSource1.UpdateParameters.Add(p);
 
        }
 
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.GridView1.EditIndex = e.NewEditIndex;
            BindGrid();
        }
 
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            DropDownList ddl = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("albumID_ddl");
            string val = ddl.SelectedValue;
            e.NewValues.Add("albumId", val);
            BindGrid();
        }
 
        protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
        {
        }
 
        protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;
            BindGrid();
        }
 
        protected void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
            }
        }
 
        protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
        {
            System.Console.WriteLine(e.Command);
 
        }
    }
 
    public class DDLTemplate : System.Web.UI.Page, ITemplate
    {
        ListItemType templateType;
        string column;
        string valueColumn;
        string displayColumn;
        SqlDataSource dataSource;
 
        public DDLTemplate(ListItemType type, string column, string valueColumn, string displayColumn, SqlDataSource dataSource)
        {
            this.templateType = type;
            this.column = column;
            this.valueColumn = valueColumn;
            this.displayColumn = displayColumn;
            this.dataSource = dataSource;
        }
 
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {
                case ListItemType.Header:
                    break;
 
                case ListItemType.Item:
                    Literal lc = new Literal();
                    lc.DataBinding += new EventHandler(lc_DataBinding);
                    container.Controls.Add(lc);
                    break;
 
                case ListItemType.EditItem:
                    DropDownList ddl = new DropDownList();
                    ddl.ID = "albumId_ddl";
                    ddl.DataValueField = this.valueColumn;
                    ddl.DataTextField = this.displayColumn;
                    ddl.DataSource = this.dataSource;
                    ddl.DataBinding += new EventHandler(ddl_DataBinding);
                    ddl.AutoPostBack = true;
                    container.Controls.Add(ddl);
                    break;
 
                case ListItemType.Footer:
                    break;
 
            }
        }
 
        void lc_DataBinding(object sender, EventArgs e)
        {
            Literal lc = (Literal)sender;
            GridViewRow row = (GridViewRow)lc.NamingContainer;
            string text = DataBinder.Eval(row.DataItem, "Album").ToString();
            lc.Text = text;
        }
 
        void ddl_DataBinding(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
            GridViewRow row = (GridViewRow)ddl.NamingContainer;
            string id = DataBinder.Eval(row.DataItem, column).ToString();
            ddl.SelectedValue = id;
        }
 
    }
 
}
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:

Select allOpen in new window

 

by: davrob60Posted on 2009-03-12 at 05:54:59ID: 23867633

i<m suprise it work. Anyway, i<m galg you found your solution.

 

by: davrob60Posted on 2009-03-12 at 05:55:17ID: 23867635

oops

galg =glad

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...