C# 如何在回发后将文本保存到绑定数据库数据的texbox中

C# 如何在回发后将文本保存到绑定数据库数据的texbox中,c#,asp.net,gridview,C#,Asp.net,Gridview,下面是组成gridview的模板字段之一。标签和文本框的所有值都来自数据库,我想重点关注这个特定的文本框,以下是aspx代码: <asp:TemplateField HeaderText="ServiceStart" SortExpression="ServiceStart"> <EditItemTemplate> <asp:TextBox ID="txtEditServiceStart" runat="server" typ

下面是组成gridview的模板字段之一。标签和文本框的所有值都来自数据库,我想重点关注这个特定的文本框,以下是aspx代码:

<asp:TemplateField HeaderText="ServiceStart" SortExpression="ServiceStart">
        <EditItemTemplate>
            <asp:TextBox ID="txtEditServiceStart" runat="server" type="date" Text='<%# Bind("ServiceStart","{0:d}") %>'  Width="128px"></asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="LblItemServiceStart" runat="server" Text='<%# Bind("ServiceStart","{0:d}") %>' ></asp:Label>
        </ItemTemplate>
</asp:TemplateField>
以下是如何编辑、取消编辑、更新的代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "EditRow")
    {
        int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
        GridView1.EditIndex = rowIndex;

        BindGrid();
    }
    else if (e.CommandName == "CancelUpdate")
    {
        GridView1.EditIndex = -1;
        BindGrid();
    }
    else if (e.CommandName == "UpdateRow")
    {
        int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;

        string ContractNo = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditContractNo")).Text;
        string contractDate = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditContractDate")).Text;  
        string contractDuration = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditContractDuration")).Text;
        string serviceStart = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditServiceStart")).Text;
        string contractDetails = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditContractDetails")).Text;
        string contractValue = ((TextBox)GridView1.Rows[rowIndex].FindControl("txtEditContractValue")).Text;
        string DropDownServed = ((DropDownList)GridView1.Rows[rowIndex].FindControl("DropDownServed")).Text;

        AccessLayer.UpdateContract(ContractNo, contractDate, contractDuration, serviceStart, contractDetails, contractValue, DropDownServed);
        GridView1.EditIndex = -1;
        BindGrid();

    }
}
AccessLayer=更新合同:

public static int UpdateContract(string ContractNo, string ContractDate, string ContractDuration, string ServiceStart, string ContractDetails, string ContractValue, string Served)
{
    string css = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString;
    using (SqlConnection con = new SqlConnection(css))
    {
        string UpdateQuery = "UPDATE SCHOLARSHIPCONTRACT SET ContractDate= @ContractDate, ContractDuration = @ContractDuration, ServiceStart = @ServiceStart, ContractDetails = @ContractDetails, ContractValue= @ContractValue, Served = @Served WHERE ContractNo =@ContractNo";
        SqlCommand UpdateCmd = new SqlCommand(UpdateQuery, con);

        SqlParameter paramOriginalContractNo = new SqlParameter("ContractNo", ContractNo);
        UpdateCmd.Parameters.Add(paramOriginalContractNo);
        SqlParameter paramContractDate = new SqlParameter("@ContractDate", ContractDate);
        UpdateCmd.Parameters.Add(paramContractDate);
        SqlParameter paramContractDuration = new SqlParameter("@ContractDuration", ContractDuration);
        UpdateCmd.Parameters.Add(paramContractDuration);
        SqlParameter paramServiceStart = new SqlParameter("@ServiceStart", ServiceStart);
        UpdateCmd.Parameters.Add(paramServiceStart);
        SqlParameter paramContractDetails = new SqlParameter("@ContractDetails", ContractDetails);
        UpdateCmd.Parameters.Add(paramContractDetails);
        SqlParameter paramContractValue = new SqlParameter("@ContractValue", ContractValue);
        UpdateCmd.Parameters.Add(paramContractValue);
        SqlParameter paramServed = new SqlParameter("@Served", Served);
        UpdateCmd.Parameters.Add(paramServed);
        con.Open();
        return UpdateCmd.ExecuteNonQuery();
    }
}

请建议我可以在aspx或c代码中添加的方式/方法谢谢你

你的问题是你总是更新你的合同日期。您必须编辑查询字符串。Add COALESCE将为ContractDate分配一个值,如果已填充该值,则该值为:@ContractDate,否则它将分配ContractDate的现有值。将方法中ContractDate的类型更改为?DateTime,它允许您将其放入方法null中。当你们调用这个方法时,若日期被编辑,只需勾选文本框,若并没有设置为空,就把它放在方法中

 public static int UpdateContract(string ContractNo, DateTime? ContractDate, string ContractDuration, string ServiceStart, string ContractDetails, string ContractValue, string Served)
    {
        string css = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString;
        using (SqlConnection con = new SqlConnection(css))
        {
            string UpdateQuery = "UPDATE SCHOLARSHIPCONTRACT SET ContractDate=COALESCE(@ContractDate=ContractDate), ContractDuration = @ContractDuration, ServiceStart = @ServiceStart, ContractDetails = @ContractDetails, ContractValue= @ContractValue, Served = @Served WHERE ContractNo =@ContractNo";
            SqlCommand UpdateCmd = new SqlCommand(UpdateQuery, con);


            UpdateCmd.Parameters.AddWithValue("ContractNo", ContractNo);
            //Here you have to convert string to DateTime
            UpdateCmd.Parameters.AddWithValue("@ContractDate", ContractDate);
            UpdateCmd.Parameters.AddWithValue("@ContractDuration", ContractDuration);
            UpdateCmd.Parameters.AddWithValue("@ServiceStart", ServiceStart);
            UpdateCmd.Parameters.AddWithValue("@ContractDetails", ContractDetails);
            UpdateCmd.Parameters.AddWithValue("@ContractValue", ContractValue);
            UpdateCmd.Parameters.AddWithValue("@Served", Served);

            con.Open();
            return UpdateCmd.ExecuteNonQuery();
        }
    }

更新后的日期也是1900年1月1日,单位为db?我怀疑您在加载页面时绑定了网格。你能分享一些你的代码吗?或者确保你做了绑定,如果!页IsPostback@mwisnicki没错,1/1/1900也在数据库中,你可以把你的代码,显示你如何更新这些数据。我想问题出在你的更新方法上。@Ted你是对的,这里有一个小代码:受保护的无效页面_loadobjectsender,EventArgs e{if!IsPostBack{BindGrid;}很抱歉,我对问题的第一个描述是错误的。请再看一次我的问题,我用图片更新了它。基本上,我只需要在gridview中再次显示数据,如果它不是由用户编辑的,而不是显示1/1/1900。我希望你能帮助我,谢谢~需要从ContractDate==Coalesciv中删除额外的等号签名e更新了AccessLayer更新契约,现在在GridView1_row命令中:否则,如果e.CommandName==UpdateRow,我将其从字符串更改为DateTime DateTime contractDate=TextBoxGridView1.Rows[rowIndex].FindControltxtEditContractDate.Text;及其给我的错误:无法将类型字符串隐式转换为System.DateTime。我想这是因为我在BindGrid中声明了字符串??有什么想法吗?谢谢大家,请建议其他方法调用SQL语句,而不使用字符串SQL=Select…,请注意,查询具有连接状态T以便我可以将ContractDate称为DateTime。或者您是否有其他建议,感谢我在声明SQL查询以绑定数据时将字符串替换为var。您能告诉我如何将字符串转换为DateTime,如回答中所述^Thank
 public static int UpdateContract(string ContractNo, DateTime? ContractDate, string ContractDuration, string ServiceStart, string ContractDetails, string ContractValue, string Served)
    {
        string css = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString;
        using (SqlConnection con = new SqlConnection(css))
        {
            string UpdateQuery = "UPDATE SCHOLARSHIPCONTRACT SET ContractDate=COALESCE(@ContractDate=ContractDate), ContractDuration = @ContractDuration, ServiceStart = @ServiceStart, ContractDetails = @ContractDetails, ContractValue= @ContractValue, Served = @Served WHERE ContractNo =@ContractNo";
            SqlCommand UpdateCmd = new SqlCommand(UpdateQuery, con);


            UpdateCmd.Parameters.AddWithValue("ContractNo", ContractNo);
            //Here you have to convert string to DateTime
            UpdateCmd.Parameters.AddWithValue("@ContractDate", ContractDate);
            UpdateCmd.Parameters.AddWithValue("@ContractDuration", ContractDuration);
            UpdateCmd.Parameters.AddWithValue("@ServiceStart", ServiceStart);
            UpdateCmd.Parameters.AddWithValue("@ContractDetails", ContractDetails);
            UpdateCmd.Parameters.AddWithValue("@ContractValue", ContractValue);
            UpdateCmd.Parameters.AddWithValue("@Served", Served);

            con.Open();
            return UpdateCmd.ExecuteNonQuery();
        }
    }