Click here to Skip to main content
15,890,506 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
See more:
I have a DetailsView that I am using to edit a GridView. When I click the edit button, the DetailsView opens and is DataBound with the values from the selected GridView Row.

My problem is after making the changes in the DetailsView, I cannot access the new values to add to my update parameters in the code-behind.

I would appreciate any advice or suggestions, thank you.

Here is the code I have so far:

C#
protected void gvEntries_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Determine the index of the selected row.
            int index = gvEntries.SelectedIndex;
            entryID = gvEntries.DataKeys[index].Value.ToString();

            string queryString = ("Select [entryFunctionName], [entrySegment], [entryLOB]," +
            "[entryTime], [entryAccountNumber], [entryProgramRevOrg], [entryQuantity], " +
            "[entryNotes] From tblEntries Where entryEntryID = " + entryID);
            dtEdit = DDLGetData(queryString);

            DetailsView1.ChangeMode(DetailsViewMode.Edit);
            DetailsView1.DataSource = dtEdit;
            DetailsView1.DataBind();

            ModalPopupExtender1.Controls.Add(editPanel);
            ModalPopupExtender1.Show();
        }

        protected void DetailsView1_ModeChanging(object sender, DetailsViewModeEventArgs e)
        {
            if (e.NewMode == DetailsViewMode.Edit)
            {
                DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);
            }
            else if (e.NewMode == DetailsViewMode.ReadOnly)
            {
                DetailsView1.ChangeMode(DetailsViewMode.Edit);
            }
        }

        DropDownList ddlfunc = new DropDownList();
        DropDownList ddlseg = new DropDownList();
        DropDownList ddlProgramRevOrg = new DropDownList();

        protected void DetailsView1_DataBound(object sender, EventArgs e)
        {
            if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
            {
                DataRowView row = (DataRowView)((DetailsView)sender).DataItem;

                ddlfunc = (DropDownList)((DetailsView)sender).FindControl("ddlfunctions");
                ddlfunc.SelectedValue = row[0].ToString();

                ddlseg = (DropDownList)((DetailsView)sender).FindControl("ddlSegment");
                ddlseg.SelectedValue = row[1].ToString();

                ddlProgramRevOrg = (DropDownList)((DetailsView)sender).FindControl("ddlRevOrg");
                string programs = "Select * From tblPrograms Where prgInactive = 'False'";
                DataTable dtprogram = new DataTable();
                dtprogram = DDLGetData(programs);
                ddlProgramRevOrg.DataSource = dtprogram;
                ddlProgramRevOrg.DataTextField = "prgProgramName";
                ddlProgramRevOrg.DataValueField = "prgRevOrg";
                ddlProgramRevOrg.DataBind();
                ddlProgramRevOrg.SelectedValue = row[5].ToString();
            }
        }

        protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
        {
if (DetailsView1.CurrentMode == DetailsViewMode.Edit)
            {
                ddlfunc = (DropDownList)DetailsView1.TemplateControl.FindControl("ddlfunctions");
                ddlfunc2 = e.NewValues.ToString();
            }
            int index = gvEntries.SelectedIndex;
            entryID = gvEntries.DataKeys[index].Value.ToString();

            //Update database with new info
            String UpdateComm = ("Update [tblEntries] Set [entryFunctionName] = @entryFunctionName Where [entryEntryID] = @entryID");
            string connectionString = Configuration.ConnectionString();

            string function = DetailsView1.FindControl("ddlfunctions").ToString();

            using (SqlConnection conn = new SqlConnection(connectionString)) 
            {
                conn.Open();

                SqlCommand updatecomm = new SqlCommand(UpdateComm, conn);

                updatecomm.Parameters.AddWithValue("@entryFunctionName", function);
                updatecomm.Parameters.AddWithValue("@entryID", entryID);

                updatecomm.ExecuteNonQuery();
                conn.Close();
            }
        }
        
       protected void OkButton_Clicked(object sender, EventArgs e)
       {
           DetailsView1.UpdateItem(false);
           ModalPopupExtender1.Hide();
           BindEntryView();
       }


The code provided is only attempting to update one column in the database for simplicity and easier reading.

Does anyone have any suggestions or advice please and thank you?

Here is the detailsview markup:

XML
<asp:DetailsView ID="DetailsView1" runat="server" onmodechanging="DetailsView1_ModeChanging" OnItemUpdating="DetailsView1_ItemUpdating"
          DefaultMode="Edit" CssClass="panelStyle" OnDataBound="DetailsView1_DataBound" CausesValidation="false" GridLines="None" AutoGenerateRows="False"><%----%>
        <Fields>
            <asp:TemplateField HeaderText="Function" >
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlfunctions" runat="server"
                        DataSource='<%# _functionCollection %>' DataTextField="Display" DataValueField="Name">
                    </asp:DropDownList>
                    <br />
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server"
                        Text='<%# Bind("entryFunctionName") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("entryFunctionName") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Segment">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlSegment" runat="server"
                    DataSource="<%# _tempSegmentCollection %>"  DataTextField="Display" DataValueField="Name">
                    <asp:ListItem>Master</asp:ListItem>
                    <asp:ListItem>MCP</asp:ListItem>
                    <asp:ListItem>Misc.</asp:ListItem>
                    </asp:DropDownList>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("entrySegment") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.entrySegment") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="LOB">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlLOB"  DataSource="<%# _tempLOBCollection %>" DataTextField="Name"
                    DataValueField="Name" runat="server">
                    <asp:ListItem>Workers Compensation</asp:ListItem>
                    </asp:DropDownList>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("entryLOB") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("entryLOB") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Time">
                <EditItemTemplate>
                    <asp:TextBox ID="tbTime" runat="server" Text='<%# Bind("entryTime") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("entryTime") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Bind("entryTime") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Account Number">
                <EditItemTemplate>
                    <asp:TextBox ID="tbAcctNmbr" runat="server"
                        Text='<%# Bind("entryAccountNumber") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox5" runat="server"
                        Text='<%# Bind("entryAccountNumber") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label5" runat="server" Text='<%# Bind("entryAccountNumber") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Program">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlRevOrg" runat="server" ><%--DataSource="<%# _programCollection %>" DataTextField="Name" DataValueField="Name"--%>
                    </asp:DropDownList>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox6" runat="server"
                        Text='<%# Bind("entryProgramRevOrg") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text='<%# Bind("entryProgramRevOrg") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Quantity">
                <EditItemTemplate>
                    <asp:TextBox ID="tbQuantity" runat="server" Text='<%# Bind("entryQuantity") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox7" runat="server" Text='<%# Bind("entryQuantity") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label7" runat="server" Text='<%# Bind("entryQuantity") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Notes">
                <EditItemTemplate>
                    <asp:TextBox ID="tbNotes" runat="server" Text='<%# Bind("entryNotes") %>'
                        TextMode="MultiLine" Height="75px"></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox8" runat="server" Text='<%# Bind("entryNotes") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label8" runat="server" Text='<%# Bind("entryNotes") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowEditButton="false" />
        </Fields>
    </asp:DetailsView>
Posted
Updated 25-Sep-12 4:57am
v5

In ItemUpdating I would try:
C#
string function = ((DropDownList)DetailsView1.FindControl("ddlfunctions")).SelectedValue.ToString();


After updating you might need to data-bing GridView again in order to show new values.
 
Share this answer
 
v2
Comments
Richard C Bishop 24-Sep-12 11:51am    
I tried that and got: "Object reference not set to an instance of an object."
sjelen 24-Sep-12 11:57am    
That would mean ASP can't find the dropdown control.
Is 'ddlfunctions' declared in markup or do you add that control dynamically at runtime?
Can you show markup for DetailsView1?
Richard C Bishop 24-Sep-12 14:35pm    
So I added code(above as an improve question entry) to the ItemUpdating event handler. It gets the first list item in the drop down list and updates the database with that. However, I need it to update the database with the list item I selected during the editing and update. Any other suggestions?
Richard C Bishop 24-Sep-12 12:00pm    
I posted the html markup. The drop down list I am updating is the first one listed in the detailsview.
sjelen 25-Sep-12 7:03am    
Is DetailsView1 inside 'editPanel'? I just saw that you're adding this panel to ModalPopupExtender at runtime. Why would you do that? Where is 'editPanel' located initially?
When you execute "ModalPopupExtender1.Controls.Add(editPanel);" you change page's control tree. On next postback (update) if you do not do the same asp.net does not know where to find control (it looks in the original location of editPanel instead inside extender.
Can you remove this line and try again? This is not the way to use this extender anyway.
Here is the actual code I ended up using in my ItemUpdating event handler:

SQL
ddlfunc2 = ((DropDownList)((DetailsView)sender).FindControl("ddlfunctions")).SelectedValue;
               e.NewValues["funcFunctionID"] = ddlfunc2;
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900