在当前行的下拉列表中选择新值时,不会更新 Gridview 数据库

本文关键字:更新 数据库 Gridview 新值时 选择 下拉列表 | 更新日期: 2023-09-27 18:32:25

我有一个有四列的网格视图。前三个是绑定字段(STARTENDYEAR,ENDYEAR和IDENTIFIER),第三个是下拉列表(CHANGE)。下拉列表的目的是更改标识符字段的值。前三列从一个预言机表中获取。每个 STARTENDYEAR 都有一个适用于它的标识符值列表。这些适用值在不同的表中可用。这些值已成功提取并填充到下拉列表中。我正在将 ASP.NET 与 C# 一起使用

要求:每当用户从下拉列表中选择不同的值时,都需要使用新的标识符值更新网格视图和后端表。

到目前为止已实现:下拉列表已填充第二个表中适用值的列表。每当用户选择新值时,我都可以在后端代码中捕获新值。

问题:无法使用提取的新标识符值更新网格视图和数据库。我怀疑这可能是一个数据绑定问题,它阻止了 sql 更新查询在后端 C# 代码上成功触发。

ASP 代码:

<%@ Page Title="Database" Language="C#" MasterPageFile="~/Site.master"    AutoEventWireup="true"
CodeFile="Database.aspx.cs" Inherits="About" %>
 <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
 </asp:Content>
 <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
 DataSourceID="SqlDataSource2" onrowdatabound="GridView1_RowDataBound1" DataKeyNames="IDENTIFIER">
        <Columns>
             <asp:BoundField DataField="STARTENDYEAR" HeaderText="STARTENDYEAR" 
                SortExpression="STARTENDYEAR" />
            <asp:BoundField DataField="ENDYEAR" HeaderText="ENDYEAR" SortExpression="ENDYEAR" />
            <asp:BoundField DataField="IDENTIFIER" HeaderText="IDENTIFIER" 
                SortExpression="IDENTIFIER" />
            <asp:TemplateField HeaderText="CHANGE" SortExpression="CHANGE"> 
                <ItemTemplate> 
                    <asp:DropDownList ID="DropDownList1" runat="server" DataTextField="CODE" DataValueField="CODE" 
                    OnSelectedIndexChanged="DropDownList_SelectedIndexChanged" AutoPostBack="True"> 
                    </asp:DropDownList> 
                </ItemTemplate> 
            </asp:TemplateField> 
        </Columns>
    </asp:GridView>
     <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:RonSql %>" 
        ProviderName="<%$ ConnectionStrings:RonSql.ProviderName %>"
    SelectCommand="select STARTENDYEAR, ENDYEAR, IDENTIFIER from R70A109 where (STATE = :SegState) order by STARTENDYEAR, ENDYEAR">
         <SelectParameters>
            <asp:SessionParameter Name="SegState" SessionField="SegState" DefaultValue="0" />
         </SelectParameters>               

    </asp:SqlDataSource>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:RonSql %>" 
        ProviderName="<%$ ConnectionStrings:RonSql.ProviderName %>"> 

    </asp:SqlDataSource>

C# 代码:

public partial class About : System.Web.UI.Page
{
        protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
        {          DataRowView CurrentRow = (DataRowView)e.Row.DataItem;
         if (e.Row.RowType == DataControlRowType.DataRow)
         {
             int StartYear = Convert.ToInt32(CurrentRow["StartYear"].ToString());
        if (StartYear > 2005)
            StartYear = 2005;
            DataTable dtcodes = GetByState(StartYear);
            DropDownList CurrentDropDown = (DropDownList)e.Row.FindControl("DropDownList1");
            CurrentDropDown.DataSource = dtcodes;
            CurrentDropDown.DataBind();
    }
}


 protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
   DropDownList SelectedDropDown = (DropDownList)sender;
   GridViewRow SelectedRow = (GridViewRow)SelectedDropDown.NamingContainer;
   int StartYear = Convert.ToInt32(SelectedRow.Cells[0].Text);
   int EndYear = Convert.ToInt32(SelectedRow.Cells[1].Text);
   int IdentifierOld = Convert.ToInt32(SelectedRow.Cells[2].Text);
   int IdentifierNew =  Convert.ToInt32(SelectedDropDown.SelectedItem.Value);

   if (StartYear < 2005)
   {
       string ConString = "Data Source=ORACLE;User ID=****;Password=****";
       string CodeUpdate = "update R70A109 set IDENTIFIER = :New_Identifier where StartYear = :StartYear) AND (EndYear = :EndYear) AND (IDENTIFIER = :Old_Identifier)";
       OracleConnection con = new OracleConnection(ConString);
       con.Open();
       OracleCommand SqlCodeUpdate = new OracleCommand(CodeUpdate, con);
       SqlCodeUpdate.Parameters.Add(new OracleParameter("@New_Identifier", IdentifierNew));
       SqlCodeUpdate.Parameters.Add(new OracleParameter("@StartYear", StartYear));
       SqlCodeUpdate.Parameters.Add(new OracleParameter("@EndYear", EndYear));
       SqlCodeUpdate.Parameters.Add(new OracleParameter("@Old_Identifier", IdentifierOld));
       OracleDataAdapter DatAdpt = new OracleDataAdapter();
       DatAdpt.UpdateCommand = SqlCodeUpdate;
        con.Close();
    }
}

}

在当前行的下拉列表中选择新值时,不会更新 Gridview 数据库

您必须在 OracleCommand 对象上调用 ExecuteNonQuery 才能在 base 中执行指令。

....

if (StartYear < 2005)
   {
       string ConString = "Data Source=ORACLE;User ID=****;Password=****";
       string CodeUpdate = "update R70A109 set IDENTIFIER = :New_Identifier where StartYear = :StartYear) AND (EndYear = :EndYear) AND (IDENTIFIER = :Old_Identifier)";
       using (OracleConnection con = new OracleConnection(ConString))
       {
            OracleCommand SqlCodeUpdate = new OracleCommand(CodeUpdate, con);
            SqlCodeUpdate.Parameters.Add(new OracleParameter("@New_Identifier", IdentifierNew));
            SqlCodeUpdate.Parameters.Add(new OracleParameter("@StartYear", StartYear));
            SqlCodeUpdate.Parameters.Add(new OracleParameter("@EndYear", EndYear));
            SqlCodeUpdate.Parameters.Add(new OracleParameter("@Old_Identifier", IdentifierOld));
            SqlCodeUpdate.Connection.Open();
            SqlCodeUpdate.ExecuteNonQuery();
       }
    }
...

找到了一种方法我遇到了同样的问题,我在网格视图的编辑模板字段中有一个下拉菜单。下拉列表中的值更改在更新期间不会影响。我已经通过以下步骤解决了它。1. 检查"行更新"事件中的下拉列表返回的值。(这应该是您选择的下拉列表的确切值)

使用下拉列表中的值查找并更改字段的值。就是这样...例如,行更新事件如下所示。'受保护的无效GridView1_RowUpdating(对象发送者,GridViewUpdateEventArgs e){

DropDownList dr = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("DropYearEdit");字符串 st = 博士。选定值;字符串 SR = 博士。SelectedItem.Text;

手动更改必填字段的内部值e.NewValues["year"] = st;}`

现在,更改的值将转到数据库。