1

私は4列のグリッドビューを持っています。最初の 3 つはバインドされたフィールド (STARTENDYEAR、ENDYEAR、および IDENTIFIER) で、3 番目はドロップダウン (CHANGE) です。ドロップダウンの目的は、IDENTIFIER フィールドの値を変更することです。最初の 3 つの列は、1 つの Oracle テーブルからフェッチされます。各 STARTENDYEAR には、適用可能な IDENTIFIER 値のリストがあります。これらの適用可能な値は、別の表で入手できます。これらの値は取得され、ドロップダウンに正常に入力されました。C# で ASP.NET を使用しています

要件: ユーザーがドロップダウンから別の値を選択するたびに、グリッドビューとバックエンド テーブルを新しい IDENTIFIER 値で更新する必要があります。

これまでの実装: ドロップダウンには、2 番目のテーブルから適用可能な値のリストが入力されています。ユーザーが新しい値を選択するたびに、バックエンド コードで新しい値を取得できます。

問題: 取得した新しい IDENTIFIER 値で gridview とデータベースを更新できません。バックエンドの C# コードで SQL 更新クエリが正常に起動されないのは、データ バインディングの問題であると思われます。

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();

    }
}

}

4

2 に答える 2

0

ベースで命令を実行するには、OracleCommand オブジェクトで ExecuteNonQuery を呼び出す必要があります。

....

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();
       }

    }
...
于 2013-09-24T05:18:15.297 に答える