【解決方法】ラジオボタンが変更されたときにグリッドビューの値を更新するにはどうすればよいですか?


ご協力いただきありがとうございます。
「出席者」SQL テーブルのデータを表示する GridView があります。
列 5 は、RadioButtonList、RbCompleted (Yes/No/Pending) を持つ TemplateField です。
列 9 は、TextBox、TbHoursCompleted を含む TemplateField です。

EditItemTemplate の RadioButton、RbCompleted:[はい]が選択されている場合、「Training」SQL テーブルの値を TextBox、TbHoursCompleted に入れるにはどうすればよいですか? (Training.dbo.Training WHERE TrainingID = @TrainingID から時間を選択)

これは、スタッフが出席者のレコードを編集し、トレーニングが完了したことを選択すると、編集中の同じ行の HoursCompleted テキスト ボックスが、GridView の選択された行からの TrainingID であるトレーニング テーブルの時間列から設定されるようにするためです。 Training テーブルの TrainingID と一致します。 GridView には、Attendees テーブルのデータが表示されていることに注意してください。

ありがとうございました!

ASP.NET
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="AttendeeID" DataSourceID="AttendeeListDataSource1" CssClass="center" CellPadding="4" ForeColor="#333333" GridLines="None">
      <AlternatingRowStyle BackColor="White" />
      <Columns>
          <asp:CommandField ShowEditButton="True" UpdateText="Save" />
          <asp:BoundField DataField="TrainingID" HeaderText="Training ID" InsertVisible="False" ReadOnly="True" SortExpression="TrainingID" Visible="True" />
          <asp:BoundField DataField="AttendeeID" HeaderText="Attendee ID" InsertVisible="False" ReadOnly="True" SortExpression="AttendeeID" Visible="True" />
          <asp:BoundField DataField="DisplayName" HeaderText="Attendee Name" SortExpression="DisplayName" ItemStyle-CssClass="colPad" Visible="True" ReadOnly="True">
          <ItemStyle HorizontalAlign="Left" />
          </asp:BoundField>
          <asp:BoundField DataField="ScheduledDate" HeaderText="Scheduled Date" SortExpression="ScheduledDate" ApplyFormatInEditMode="True" DataFormatString="{0:d}" HtmlEncode="False" ControlStyle-Width="80px" ControlStyle-CssClass="dateField" >
              <ControlStyle CssClass="dateField" Width="80px"></ControlStyle>
          </asp:BoundField>
          <asp:TemplateField HeaderText="Completed" SortExpression="Completed" ControlStyle-CssClass="colPad">
              <EditItemTemplate>
                  <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Completed") %>'></asp:TextBox>--%>
                  <asp:RadioButtonList ID="RbCompleted" runat="server" Text='<%# Bind("Completed") %>' OnSelectedIndexChanged="RbCompleted_SelectedIndexChanged">
                      <asp:ListItem>Yes</asp:ListItem>
                      <asp:ListItem>No</asp:ListItem>
                      <asp:ListItem>Pending</asp:ListItem>
                  </asp:RadioButtonList>
              </EditItemTemplate>
              <ItemTemplate>
                  <asp:Label ID="Label1" runat="server" Text='<%# Bind("Completed") %>'></asp:Label>
              </ItemTemplate>
              <ControlStyle CssClass="colPad"></ControlStyle>
          </asp:TemplateField>
          <asp:BoundField DataField="CompletedDate" HeaderText="Completed Date" SortExpression="CompletedDate" ApplyFormatInEditMode="True" DataFormatString="{0:d}" HtmlEncode="False" ControlStyle-Width="80px" ControlStyle-CssClass="dateField" >
              <ControlStyle CssClass="dateField" Width="80px"></ControlStyle>
          </asp:BoundField>
          <asp:BoundField DataField="RescheduledDate" HeaderText="Rescheduled Date" SortExpression="RescheduledDate" ApplyFormatInEditMode="True" DataFormatString="{0:d}" HtmlEncode="False" ControlStyle-Width="80px" ControlStyle-CssClass="dateField" >
              <ControlStyle CssClass="dateField" Width="80px"></ControlStyle>
          </asp:BoundField>
          <asp:BoundField DataField="Canceled" HeaderText="Canceled Date" SortExpression="Canceled" ApplyFormatInEditMode="True" DataFormatString="{0:d}" HtmlEncode="False" ControlStyle-Width="80px" ControlStyle-CssClass="dateField" >
              <ControlStyle CssClass="dateField" Width="80px"></ControlStyle>
          </asp:BoundField>
          <asp:TemplateField HeaderText="Hours Completed" SortExpression="HoursCompleted">
              <EditItemTemplate>
                  <asp:TextBox ID="TbHoursCompleted" runat="server" Text='<%# Bind("HoursCompleted", "{0:n2}") %>' onkeypress="return num(this);" ></asp:TextBox>
              </EditItemTemplate>
              <ItemTemplate>
                  <asp:Label ID="LbHoursCompleted" runat="server" Text='<%# Bind("HoursCompleted", "{0:n2}") %>'></asp:Label>
              </ItemTemplate>
              <ControlStyle Width="40px" />
          </asp:TemplateField>
      </Columns>
      <EditRowStyle BackColor="#FF9999" />
      <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
      <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
      <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
      <RowStyle BackColor="#EFF3FB" />
      <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
      <SortedAscendingCellStyle BackColor="#F5F7FB" />
      <SortedAscendingHeaderStyle BackColor="#6D95E1" />
      <SortedDescendingCellStyle BackColor="#E9EBEF" />
      <SortedDescendingHeaderStyle BackColor="#4870BE" />
  </asp:GridView>

  <asp:SqlDataSource ID="AttendeeListDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TrainingConnectionString %>"
      SelectCommand="SELECT [TrainingID], [AttendeeID], [DisplayName], [ScheduledDate], ISNULL([Completed],'Pending') AS Completed, [CompletedDate], [RescheduledDate], [Canceled], CASE WHEN CompletedDate IS NULL THEN '0' ELSE HoursCompleted END AS [HoursCompleted] FROM [Attendees] WHERE (ISNULL([Completed],'Pending') LIKE '%' + @Completed + '%') AND TrainingID LIKE '%' + @TrainingName + '%' AND DisplayName LIKE '%' + @AttendeeNameSearch + '%' ORDER BY [DisplayName]"
      DeleteCommand="DELETE FROM [Attendees] WHERE [AttendeeID] = @AttendeeID"
      InsertCommand="INSERT INTO [Attendees] ([DisplayName], [ScheduledDate], [Completed], [CompletedDate], [RescheduledDate], [Canceled], [HoursCompleted]) VALUES (@DisplayName, @ScheduledDate, @Completed, @CompletedDate, @RescheduledDate, @Canceled, @HoursCompleted)"
      UpdateCommand="UPDATE [Attendees] SET [ScheduledDate] = @ScheduledDate, [Completed] = @Completed, [CompletedDate] = @CompletedDate, [RescheduledDate] = @RescheduledDate, [Canceled] = @Canceled, [HoursCompleted] = @HoursCompleted WHERE [AttendeeID] = @AttendeeID">
      <DeleteParameters>
          <asp:Parameter Name="AttendeeID" Type="Int32" />
      </DeleteParameters>
      <InsertParameters>
          <asp:Parameter Name="TrainingID" Type="Int32" />
          <asp:Parameter Name="DisplayName" Type="String" />
          <asp:Parameter DbType="Date" Name="ScheduledDate" />
          <asp:Parameter Name="Completed" Type="String" />
          <asp:Parameter DbType="Date" Name="CompletedDate" />
          <asp:Parameter DbType="Date" Name="RescheduledDate" />
          <asp:Parameter DbType="Date" Name="Canceled" />
          <asp:Parameter Name="HoursCompleted" Type="Decimal" />
      </InsertParameters>
      <SelectParameters>
          <asp:ControlParameter ControlID="Completed" DefaultValue="%%" Name="Completed" PropertyName="SelectedValue" Type="String" />
          <asp:ControlParameter ControlID="TrainingName" DefaultValue="%%" Name="TrainingName" PropertyName="SelectedValue" Type="String" />
          <asp:ControlParameter ControlID="AttendeeNameSearch" DefaultValue="%%" Name="AttendeeNameSearch" PropertyName="Text" Type="String" />
      </SelectParameters>
      <UpdateParameters>
          <asp:Parameter Name="TrainingID" Type="Int32" />
          <asp:Parameter Name="DisplayName" Type="String" />
          <asp:Parameter DbType="Date" Name="ScheduledDate" />
          <asp:Parameter Name="Completed" Type="String" />
          <asp:Parameter DbType="Date" Name="CompletedDate" />
          <asp:Parameter DbType="Date" Name="RescheduledDate" />
          <asp:Parameter DbType="Date" Name="Canceled" />
          <asp:Parameter Name="HoursCompleted" Type="Decimal" />
          <asp:Parameter Name="AttendeeID" Type="Int32" />
      </UpdateParameters>
  </asp:SqlDataSource>

私が試したこと:

C#
// I totally don't know what I'm doing here:
    protected void AddHoursCompleted()
    {
        SqlConnection DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["StaffRosterConnectionString"].ConnectionString);
        string sql = "SELECT TOP 1 Hours FROM Training WHERE TrainingID = @TrainingID";
        SqlCommand DBCmd = new SqlCommand(sql, DBConn);

        try
        {
            DBConn.Open();
            DBCmd.Parameters.Add("@TrainingID", SqlDbType.VarChar).Value = GridView1.SelectedRow.FindControl("TrainingID");   //GridView1.TrainingID Selected Row column Index 1;  ?    //EmployeeName.Text;

            SqlDataReader dr = DBCmd.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    //Session["UID"] = (int)dr["ID"];
                    // = dr["Hours"].ToString();  // In GridView
                    //AssignmentDate.Text = dr.GetDateTime(14).ToString("MM/dd/yyyy");         //Column Index of 14 is Effective Date
                    //HireDate.Text = dr.GetDateTime(6).ToString("MM/dd/yyyy");                    //Column Index of 6 is DOH.
                }

                dr.Close();
            }
            else
            {
                //msgFetch.Text = "No records found.";
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        DBCmd.Dispose();
        DBConn.Close();
    }

    protected void RbCompleted_SelectedIndexChanged(object sender, EventArgs e)
    {
        AddHoursCompleted();
    }

解決策 1

ASP.NET はわかりませんが、C# とあなたのコードは本当に乱雑に見えます。 したがって、私はあなたにいくつかのヒントを与えます:

1)独自の(静的またはシングルトン)クラスを使用して、データベースと一般的に通信する必要があります。必要なメソッドは、Read、Write、WriteMultiple、および(オプションで)vacuum の 3 ~ 4 つだけです。

C#
public static class DB {
    private static string _ConnectionString = "...";

    public static DataTable Read(DBQuery query) { ... }
    public static void Vacuum() { ... }
    public static void Write(DBQuery query) { ... }
    public static void WriteMultiple(DBQueries queries) { ... }
}

エンティティ クラスを介して、準備されたパラメータ化された DB クエリ (または複数のクエリ) を使用して、これらのメソッド (Vacuum を除く) を呼び出します。以下を参照してください。

2) 各エンティティ (例: “出席者” と “トレーニング”) に対して、プロパティと、実際に必要な対応するデータベース メソッドを定義する独自のエンティティ クラスが必要です。例: MapFromDB、ReadMaxID、ReadAllFromDB、ReadFromDB、RemoveFromDB、SaveToDB。

これらのデータベース メソッド内で、対応する SQL クエリとパラメーターを作成し、DB クラスのメソッドを呼び出して (Read… を使用する場合)、結果の DataTable を MapFromDB() メソッドを介してエンティティ オブジェクトにマップします。

また、表示するエンティティと、そのアプローチが理にかなっている場合についても検討する必要があります。 出席者とトレーニングを組み合わせて使用​​しているように見えるため、これには独自のエンティティ タイプが必要です。これには、両方のプロパティと、一度に 2 つの異なる SQL テーブルに影響を与えるデータベース メソッドが含まれます。 さらに、一度にすべてのエントリを更新する必要があるため、1 人の出席者が複数回出現する可能性があるリスト内に出席者の合計トレーニング時間を表示することは合理的ではないと思います。 別のサブ GridView を使用して、1 人の出席者のすべてのトレーニングを表示し、合計トレーニング時間をヘッダー情報として、および/または出席者のみを表示する GridView で表示 (および更新) することをお勧めします。

3) コントロール (GridView など) をデータベース ソースに直接バインドしないでください。代わりに (Binding)Lists を使用して、エンティティ オブジェクトとそのメソッドを直接操作します。 これは、コードを作り直す必要がある古典的なアプローチですが、データベースから何かが読み取られたり更新されたりするときは常に完全に制御できます。

4) GridView の処理は次のとおりです。

データベースからすべてのエンティティを読み取り、それらを (Binding)List にマップします。 次に、このリストを GridView ソースに使用/バインドします。

GridView 内で対話する場合 (セルの編集、コマンド関数の使用など) は、GridView の個別のメソッドを呼び出します。ここでは、選択した GridView 行の単一のエンティティ オブジェクトを使用および操作し、必要に応じて、データベースを更新または読み取ります。エンティティ クラスにあるデータベース メソッド。 はるかに優れたアプローチは、データ操作に「保存」https://www.codeproject.com/「適用」https://www.codeproject.com/「OK」ボタンを使用して個別の追加ダイアログと編集ダイアログを使用することです。 .

したがって、GridView 行内でコマンド関数を使用する場合は、選択した行の ID 列を使用して単一のエンティティを取得し、(Binding)List でこの ID を介してエンティティを検索します。 次に、その単一のエンティティを直接操作します。

あなたの場合、メソッド RbCompleted_SelectedIndexChanged() (ラジオ ボタンを変更するとトリガーされる) 内で、対応する行インデックスを使用して、列「AttendeeID」および/または「TrainingID」の内容を読み取り、対応する単一の値を取得する必要があります。 GridView データソースのエンティティ ((Binding)List である必要があります)。 取得したら、この単一のエンティティを操作し、そのデータベース メソッド (ReadTotalTrainingHours() または UpdateTotalTrainingHours() など) を使用してそのプロパティを更新できます。

エンティティを更新することにより、GridView は更新された値を自動的に表示する必要があります。 そうでない場合は、GridView.InvalidateRow() メソッドを追加で呼び出す必要があります。

幸運を!

コメント

タイトルとURLをコピーしました