• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 214
  • Last Modified:

Can NOT update from GridView

I am totally stuck! I have a gridview where the select, and delete commands are working just fine. However, the updates are not working. I don't get any errors but the data never changes. Here is my GridView and Code Behind.

<asp:GridView ID="ExpenseView" runat="server" DataSourceID="ExpenseSqlDataSource" BorderColor="White" BorderWidth="1px" CellPadding="5" GridLines="None" ShowFooter="True" AutoGenerateColumns="False" DataKeyNames="cost_detail_id,cost_detail_amnt" Width="100%" OnDataBinding="GetExpenseTotal">
                                    <Columns>
                                        <asp:BoundField DataField="expense_type_desc" HeaderText="Expense Type" SortExpression="expense_type_desc" >
                                            <HeaderStyle CssClass="frm_tbl_head" />
                                            <FooterStyle  CssClass="total_area" />
                                            <ItemStyle Wrap="False" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="asset_type_desc" HeaderText="Asset Type" SortExpression="asset_type_desc" >
                                            <HeaderStyle CssClass="frm_tbl_head" />
                                            <FooterStyle  CssClass="total_area" HorizontalAlign="Right" />
                                            <ItemStyle Wrap="False" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="vendor_name" HeaderText="Vendor Name" SortExpression="vendor_name" FooterText="<span style='line-height:20px;'>Capital Total:<br>Operating Total:<br>Bid Total:</span>" >
                                            <HeaderStyle CssClass="frm_tbl_head" />
                                            <FooterStyle  CssClass="total_area" HorizontalAlign="Right" />
                                            <ItemStyle Wrap="False" />
                                        </asp:BoundField>
                                        <asp:TemplateField  HeaderText="Amount" SortExpression="cost_detail_amnt">
                                            <HeaderStyle CssClass="frm_tbl_head" />
                                            <FooterStyle  CssClass="total_area" />
                                            <ItemStyle Wrap="False" />
                                            <ItemTemplate>
                                                <%#  String.Format("{0:c}", Eval("cost_detail_amnt")) %>
                                            </ItemTemplate>
                                            <EditItemTemplate>
                                                 <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("cost_detail_amnt") %>' />
                                            </EditItemTemplate>
                                            <FooterTemplate>
                                                <span style="line-height:20px;">
                                                <%# String.Format("{0:c}", Decimal.Parse(request_capital_tot.Value)) %><br />
                                                <%# String.Format("{0:c}", Decimal.Parse(request_operating_tot.Value)) %><br />
                                                <%# String.Format("{0:c}", Decimal.Parse(bid_tot.Value)) %>
                                                </span>
                                            </FooterTemplate>
                                        </asp:TemplateField>
                                        <asp:CommandField ShowDeleteButton="True" DeleteText="clear" ShowEditButton="true" EditText="edit" UpdateText="update" CancelText="cancel">
                                            <FooterStyle  CssClass="total_area" />
                                        </asp:CommandField>
                                    </Columns>
                                    <HeaderStyle BackColor="White" Wrap="False" HorizontalAlign="Left" />
                                </asp:GridView>
                                <asp:SqlDataSource ID="ExpenseSqlDataSource" runat="server" />

--------------------- CODE BEHIND --------------------------------


ExpenseSqlDataSource.ConnectionString = cnnStr;
        sql = "SELECT e.expense_type_cd, e.expense_type_desc, a.asset_type_desc, " +
                "c.vendor_name, c.cost_detail_amnt, c.cost_detail_id " +
                "FROM cost_detail c " +
                "INNER JOIN asset_type a " +
                "ON c.asset_type_id = a.asset_type_id " +
                "INNER JOIN expense_type e " +
                "ON a.expense_type_cd = e.expense_type_cd " +
              "WHERE c.project_id = @project_id " +
              "ORDER BY c.cost_detail_id";
        ExpenseSqlDataSource.SelectCommand = sql;
        ExpenseSqlDataSource.SelectParameters.Clear();
        ExpenseSqlDataSource.SelectParameters.Add("project_id", project_id.Value);
        ExpenseSqlDataSource.DeleteCommand = "DELETE FROM cost_detail WHERE cost_detail_id = @cost_detail_id";
        ExpenseSqlDataSource.UpdateCommand = "UPDATE cost_detail SET cost_detail_amnt = @cost_detail_amnt WHERE cost_detail_id = @cost_detail_id";
        ExpenseView.DataBind();

0
HangTenDesign
Asked:
HangTenDesign
  • 5
  • 3
1 Solution
 
jnhorstCommented:
When you load the data in Page_Load (I am assuming), are you calling DataBind() on the grid within or without an if block checink for a postback?

For example: (inside of Page_Load)

// code to load data here...

// check postback.
if (!this.IsPostBack)
{
     // bind grid.
     grdView.DataBind();
}

The reason you want to get your data outside of the if block above, and bind inside the block is when you click your Update link, Page_Load will fire first, then your UpdateCommand routine.  If you are calling DataBind() outside of the if block (meaning it gets called on a postback) the DataBind() call replaces whatever changes your user makes with the original value, which is likely why you do not see any update.

John
0
 
HangTenDesignAuthor Commented:
Nope, that didn't do it.
0
 
jnhorstCommented:
Where does the code you posted above execute?

John
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
HangTenDesignAuthor Commented:
In the page_load. But I replaced with you code and it still did not work. I even started a new browser to be sure.
0
 
jnhorstCommented:
Show me the full Page_Load event...

John
0
 
HangTenDesignAuthor Commented:
rotected void Page_Load(object sender, EventArgs e)
    {
        PageTitle.Text = "New Project Approval";

        network_id = (string)HttpContext.Current.Session["network_id"];

        Security _Security = new Security(network_id);

        if (!IsPostBack)
        {  
            project_id.Value = Request.QueryString["pid"];

            GetDropdownItems();

            if (project_id.Value == "")
            {
                GetUserInfo();

                session_id.Value = GetUniqueId(15);

                project_id.Value = "0";

                SetSessionId();
            }
            else
            {
                GetProjectInfo();
            }

            ShowHideSteps(1);
           
            budget_type_cd_BU.Attributes.Add("OnClick", "ShowProjectNumber();");
            budget_type_cd_UB.Attributes.Add("OnClick", "ShowProjectNumber();");
            budget_type_cd_EM.Attributes.Add("OnClick", "ShowProjectNumber();");
        }

        string sql;
        MpcSqlDataSource.ConnectionString = cnnStr;
        sql = "SELECT pm.project_mpc_id, m.assetid, m.assettype, m.total_cost " +
                "FROM mpc m " +
                "INNER JOIN project_mpc pm " +
                "ON m.mpc_id = pm.mpc_id " +
                "WHERE pm.project_id = @project_id " +
                "ORDER BY pm.project_mpc_id";
        MpcSqlDataSource.SelectCommand = sql;
        MpcSqlDataSource.SelectParameters.Clear();
        MpcSqlDataSource.SelectParameters.Add("project_id", project_id.Value);
        MpcSqlDataSource.DeleteCommand = "DELETE FROM project_mpc WHERE project_mpc_id = @project_mpc_id";
        MpcSqlDataSource.DataBind();

        ExpenseSqlDataSource.ConnectionString = cnnStr;
        sql = "SELECT e.expense_type_cd, e.expense_type_desc, a.asset_type_desc, " +
                "c.vendor_name, c.cost_detail_amnt, c.cost_detail_id " +
                "FROM cost_detail c " +
                "INNER JOIN asset_type a " +
                "ON c.asset_type_id = a.asset_type_id " +
                "INNER JOIN expense_type e " +
                "ON a.expense_type_cd = e.expense_type_cd " +
              "WHERE c.project_id = @project_id " +
              "ORDER BY c.cost_detail_id";
        ExpenseSqlDataSource.SelectCommand = sql;
        ExpenseSqlDataSource.SelectParameters.Clear();
        ExpenseSqlDataSource.SelectParameters.Add("project_id", project_id.Value);
        ExpenseSqlDataSource.DeleteCommand = "DELETE FROM cost_detail WHERE cost_detail_id = @cost_detail_id";
        ExpenseSqlDataSource.UpdateCommand = "UPDATE cost_detail SET cost_detail_amnt = @cost_detail_amnt WHERE cost_detail_id = @cost_detail_id";
        ExpenseView.DataBind();

        if (iStep.Value == "3")
        {
            Page.SmartNavigation = true;
        }
    }
0
 
jnhorstCommented:
You are building your expense data source and calling DataBind() outside the if (!IsPostBack) {} code block.  What is happening thus is every time you change your data and click an Update command link/button you are requerying your database and rebinding the grid with the data in the database before the UpdateCommand routine locates the data to do an update.  You need to build and execute your command object outside the if block, but call DataBind() on the grid inside the if block so that the grid does not get refreshed before your UpdateCommand routine fires.  This way the grid will still have the user's changes when your UpdateCommand routine fires.

John
0
 
jnhorstCommented:
Try this:

// get project id
project_id.Value = Request.QueryString["pid"];

// build your data source's and their command objects...

// check postback.
if (!IsPostBack)
{
     // get dropdown items... you can do this inside the block because you do not update dropdown lists.

     // bind the controls.  you MUST do this inside the block if you want to get user changes to data in the grids.
     MpcSqlDataSource.DataBind();
     ExpenseView.DataBind();

     // do other things...
}

John
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now