?
Solved

Can NOT update from GridView

Posted on 2006-10-27
8
Medium Priority
?
210 Views
Last Modified: 2010-08-05
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
Comment
Question by:HangTenDesign
  • 5
  • 3
8 Comments
 
LVL 10

Expert Comment

by:jnhorst
ID: 17820271
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
 

Author Comment

by:HangTenDesign
ID: 17820782
Nope, that didn't do it.
0
 
LVL 10

Expert Comment

by:jnhorst
ID: 17820941
Where does the code you posted above execute?

John
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 

Author Comment

by:HangTenDesign
ID: 17821080
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
 
LVL 10

Expert Comment

by:jnhorst
ID: 17821270
Show me the full Page_Load event...

John
0
 

Author Comment

by:HangTenDesign
ID: 17821692
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
 
LVL 10

Expert Comment

by:jnhorst
ID: 17821739
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
 
LVL 10

Accepted Solution

by:
jnhorst earned 2000 total points
ID: 17821801
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

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
Problem Hi all,    While many today have fast Internet connection, there are many still who do not, or are connecting through devices with a slower connect, so light web pages and fast load times are still popular.    If your ASP.NET page …
Integration Management Part 2
Screencast - Getting to Know the Pipeline
Suggested Courses

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question