其实就是一个简单的datagrid中的修改功能.点击"修改",按钮就变为""和"取消",原来datagrid中的label就变成textbox,修改完后按"保存"进行存储.按为什么要点击两次"修改",按钮和label才会变的?正常应该是一按就变才对.追踪代码,发觉按第二次"修改"的时候,就运行了update函数,然后按"保存"的时候又运行一次,晕,为什么会这样呢?

解决方案 »

  1.   

    aspx:
           <asp:datagrid ID="NeedArrayGrid" runat="server" DataSourceID="tmp_pay" AllowPaging="True" AutoGenerateColumns="False" PageSize="5"
            OnEditCommand="NeedArrayGrid_Edit" OnCancelCommand="NeedArrayGrid_Cancel" OnUpdateCommand="NeedArrayGrid_Update" DataKeyField="keyid">
            <columns>
                <asp:EditCommandColumn CancelText="取消" EditText="修改" UpdateText="保存" ButtonType="PushButton"></asp:EditCommandColumn>
            <asp:BoundColumn HeaderText="序号" DataField="keyid" ReadOnly="True"/>
           <asp:BoundColumn HeaderText="连接序号" DataField="user_payApp_key" ReadOnly="True"/>
                    <asp:BoundColumn HeaderText="提交日期" DataField="ApplyDate" ReadOnly="True"/>
                    <asp:BoundColumn HeaderText="期间" DataField="period" ReadOnly="True"/>
                    <asp:BoundColumn HeaderText="公司" DataField="CompanyName" ReadOnly="True"/>
                    <asp:TemplateColumn HeaderText="金额"> 
                <ItemTemplate>
                    <asp:Label ID="accountLab" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.payAmount") %>'></asp:Label>
                </ItemTemplate>  
                <EditItemTemplate>
                    <asp:TextBox ID="account" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.payAmount") %>'></asp:TextBox>    
                </EditItemTemplate>   
            </asp:TemplateColumn>   
            </columns>        
            </asp:datagrid><asp:SqlDataSource ID="tmp_pay" runat="server" ConnectionString="<%$ ConnectionStrings:cwxtConn %>"
                SelectCommand="SELECT keyid, user_payApp_key, DepartmentID, ApplyDate, period, PayMode, Memo, CompanyName, BankName, AccountNum, Purpose, LinkPerson, Tele, Fax, payAmount, Accountant, GeneralManager, CFO, DepartDirector, Proposer, item13, re FROM tmp_PayApply WHERE (re = 0)">
            </asp:SqlDataSource>
      

  2.   

    aspx.cs protected void NeedArrayGrid_Edit(Object sender, DataGridCommandEventArgs E)
        {
            try
            {
                NeedArrayGrid.EditItemIndex = (int)E.Item.ItemIndex ;
            }
            catch (System.Exception e)
            {
                
            }
        }    protected void NeedArrayGrid_Cancel(Object sender, DataGridCommandEventArgs E)
        {
            try
            {
                NeedArrayGrid.EditItemIndex = -1;
                NeedArrayGrid.DataBind();
            }
            catch (System.Exception e)
            {        }
        }    protected void NeedArrayGrid_Update(Object sender, DataGridCommandEventArgs E)
        {
            try
            {
                updateSql = "UPDATE tmp_PayApply SET " +
                            "payAmount = @payAmount " +
                            "WHERE keyid=@keyid and user_payApp_key = @user_payApp_key";            DBConn dbConn = new DBConn();
                myConn = dbConn.DBConnection("cwxtConn");
                myConn.Open(); 
                keyId = int.Parse(E.Item.Cells[1].Text);
                user_payApp_key = int.Parse(E.Item.Cells[2].Text);
                payAmount = double.Parse(((TextBox)E.Item.FindControl("account")).Text);
                updateCmd = new SqlCommand(updateSql, myConn);
                updateCmd.Parameters.Add(new SqlParameter("@payAmount", payAmount));
                updateCmd.Parameters.Add(new SqlParameter("@keyid", keyId));
                updateCmd.Parameters.Add(new SqlParameter("@user_payApp_key", user_payApp_key));            updateCmd.ExecuteNonQuery();
                myConn.Close();
    //            NeedArrayGrid.EditItemIndex = -1;
                NeedArrayGrid.DataBind();
            }
            catch (System.Exception e)
            {        }
        }
      

  3.   

    找到原因了,edit那里忘记加databind();晕自己一个,看来.net和java还是不同的......
      

  4.   

    NeedArrayGrid.EditItemIndex = (int)E.Item.ItemIndex ;
    ---------
    更改之后都要重新绑定的