# 送信失敗データ再送ボタン実装手順書
## 概要
送信履歴管理詳細画面(T_SendHistoryDetail)に「送信失敗データのみを再送する」ボタンを追加し、送信失敗データを再送信できる機能を実装します。
## 実装の前提条件
### 関連ファイル
1. **T_SendHistoryDetail.cs** - 送信履歴詳細画面(修正対象)
2. **T_SendHistoryDetail.Designer.cs** - 送信履歴詳細画面のデザイナーファイル(修正対象)
3. **MessageSendResultControl.cs** - 送信結果表示コントロール(参考実装)
4. **T_MessageSender.cs** - メッセージ送信画面(呼び出し先)
5. **BtnReturnControl.cs** - ボタンコントロール(既存)
### 現状の実装状況
- T_SendHistoryDetailは、MessageSendResultControlを内包して送信結果を表示している
- MessageSendResultControlには既に「送信失敗データ再送」ボタン(btnReSend)が実装されている
- しかし、T_SendHistoryDetailでは、MessageSendResultControl内のbtnBackボタンを非表示にしている(108行目)
- 再送ボタンは、送信失敗件数が0より大きい場合のみ表示される(MessageSendResultControl.cs 117行目)
## 実装方針
### 方針1: MessageSendResultControl内の既存ボタンを活用する方法(推奨)
既にMessageSendResultControl内に実装されている再送ボタンの機能を活用し、T_SendHistoryDetailから新しいT_MessageSenderフォームを開くように調整します。
### 方針2: T_SendHistoryDetailに新規ボタンを追加する方法
BtnReturnControlに再送ボタンを追加するか、新しいボタンコントロールを作成して配置します。
## 詳細実装手順(方針1:推奨)
### ステップ1: T_SendHistoryDetail.csの修正
#### 1.1 イベントハンドラの登録
T_SendHistoryDetail_Loadメソッド内で、MessageSendResultControlのSwitchToMessageInputOnlyFailedイベントを登録します。
```csharp
private void T_SendHistoryDetail_Load(object sender, EventArgs e)
{
_btnControl.BtnReturnClicked += BtnReturn_Click;
// 追加:再送ボタンのイベントハンドラを登録
_messageSendResult.SwitchToMessageInputOnlyFailed += MessageSendResult_SwitchToMessageInputOnlyFailed;
// 送信履歴データを表示
if (_sendHistory != null)
{
// MessageSendResultControlのRenderResultsメソッドを使用してヘッダー情報も含めて表示
_messageSendResult.RenderResults(_sendHistory.SendHistoryId);
// 送信タイプに応じてモードを変更
_messageSendResult.ChangeMode((Utils.Constants.SEND_TYPE)_sendHistory.SendType);
}
}
```
#### 1.2 イベントハンドラメソッドの実装
送信失敗データ再送のイベントハンドラを実装します。
```csharp
/// <summary>
/// 送信失敗データ再送ボタンクリック時の処理
/// </summary>
/// <param name="reSendHistoryId">再送する履歴ID</param>
private void MessageSendResult_SwitchToMessageInputOnlyFailed(int reSendHistoryId)
{
try
{
// 送信タイプを取得(定期送信か不定期送信か)
var sendType = (Utils.Constants.SEND_TYPE)_sendHistory.SendType;
// T_MessageSenderフォームのインスタンスを生成
T_MessageSender messageSender = new T_MessageSender(sendType);
// 現在のフォームを親フォームとして設定
messageSender.Owner = this;
// 現在のフォームを非表示にする
this.Hide();
// 送信失敗データを読み込んで表示
messageSender.SwitchToMessageInputOnlyFailedRequested(reSendHistoryId);
// モーダルダイアログとして表示
messageSender.ShowDialog();
}
catch (Exception ex)
{
// エラーが発生した場合はメッセージを表示
MessageBox.Show($"送信失敗データの再送画面を開く際にエラーが発生しました。\\n{ex.Message}",
"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
// フォームを再表示
this.Show();
}
}
```
#### 1.3 FormClosingイベントの修正
イベントハンドラの登録解除を追加します。
```csharp
private void T_SendHistoryDetail_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("送信履歴管理 詳細画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
return;
}
// イベント登録の解除
_btnControl.BtnReturnClicked -= BtnReturn_Click;
// 追加:再送ボタンのイベントハンドラの登録解除
_messageSendResult.SwitchToMessageInputOnlyFailed -= MessageSendResult_SwitchToMessageInputOnlyFailed;
// 明示的に解放する
this.DisposeViewControls();
// 設定メニューを表示する
this.Owner.Show();
// 再描写を行う
this.Owner.Refresh();
}
```
### ステップ2: 動作確認項目
#### 2.1 正常系テスト
1. 送信履歴詳細画面を開く
2. 送信失敗データがある履歴を表示
3. 「送信失敗データ再送」ボタンが表示されることを確認
4. ボタンをクリックして、T_MessageSenderフォームが開くことを確認
5. 送信失敗データのみが自動的にセットされていることを確認
6. T_MessageSenderフォームを閉じて、元の詳細画面に戻ることを確認
#### 2.2 異常系テスト
1. 送信失敗データがない履歴を表示し、再送ボタンが表示されないことを確認
2. データベース接続エラーなどの例外が発生した場合、エラーメッセージが表示されることを確認
3. メモリ不足などでフォーム生成に失敗した場合、適切にエラーハンドリングされることを確認
### ステップ3: 追加考慮事項
#### 3.1 メモリリーク対策
- T_MessageSenderフォームのインスタンスは、使用後に適切に破棄される必要があります
- ShowDialog()を使用することで、フォームが閉じられた際に自動的にDisposeされます
#### 3.2 ユーザビリティの向上
- 再送ボタンには適切なツールチップを設定することを検討
- 再送処理中は処理中であることを示すインジケータの表示を検討
#### 3.3 セキュリティ考慮事項
- 再送権限の確認(必要に応じて)
- 送信履歴の改ざん防止
## 実装方針2の場合(代替案)
### BtnReturnControlへの再送ボタン追加
#### 修正ファイル
1. BtnReturnControl.cs
2. BtnReturnControl.Designer.cs
#### 実装手順
1. BtnReturnControl.Designer.csにボタンを追加
2. ボタンのプロパティ設定(Text: "送信失敗データ再送"、Font: HG丸ゴシックM-PRO, 18pt)
3. イベントハンドラの追加
4. T_SendHistoryDetailでの制御実装
この方法は、既存のコントロール構造を大きく変更する必要があるため、推奨しません。
## エラーハンドリング
### 想定されるエラーと対処法
1. **データベース接続エラー**
- エラーメッセージ: "データベースへの接続に失敗しました。"
- 対処: 接続を再試行するか、管理者に連絡
2. **送信履歴データ不整合**
- エラーメッセージ: "送信履歴データが見つかりません。"
- 対処: 画面を更新して最新のデータを取得
3. **メモリ不足**
- エラーメッセージ: "メモリが不足しています。"
- 対処: 不要なアプリケーションを終了してから再試行
## テストシナリオ
### シナリオ1: 基本的な再送機能
1. 送信失敗を含む履歴を選択
2. 詳細画面を開く
3. 再送ボタンをクリック
4. 送信画面が開き、失敗データが表示される
5. 送信を実行し、成功することを確認
### シナリオ2: 全件成功時の動作
1. 全件成功の履歴を選択
2. 詳細画面を開く
3. 再送ボタンが表示されないことを確認
### シナリオ3: 画面遷移の確認
1. 詳細画面から再送画面を開く
2. 再送画面を閉じる
3. 元の詳細画面に戻ることを確認
4. 詳細画面を閉じる
5. 一覧画面に戻ることを確認
## 実装完了チェックリスト
- [ ] T_SendHistoryDetail.csへのイベントハンドラ登録の追加
- [ ] MessageSendResult_SwitchToMessageInputOnlyFailedメソッドの実装
- [ ] FormClosingイベントでのイベント登録解除の追加
- [ ] エラーハンドリングの実装
- [ ] 正常系テストの実施
- [ ] 異常系テストの実施
- [ ] コードレビューの実施
- [ ] ドキュメントの更新
## 注意事項
1. **既存機能への影響**
- MessageSendResultControlの既存の動作に影響を与えないよう注意
- 他の画面でMessageSendResultControlを使用している箇所の動作確認
2. **パフォーマンス**
- 大量の送信失敗データがある場合のパフォーマンスを考慮
- 必要に応じてページング処理の実装を検討
3. **保守性**
- コードの可読性を保つため、適切なコメントを追加
- 将来の拡張を考慮した実装
## 実装後の確認事項
1. 送信失敗データの再送が正常に動作すること
2. 画面遷移が適切に行われること
3. メモリリークが発生していないこと
4. エラーハンドリングが適切に機能すること
5. ユーザビリティが損なわれていないこと
## 参考情報
### MessageSendResultControl.csの既存実装(202-209行目)
```csharp
private void btnReSend_Click(object sender, EventArgs e)
{
// 最終確認
var result = MessageBoxUtil.ShowYesNo(MessageBoxUtil.ASK_004);
if (result != DialogResult.Yes) return;
// 送信入力画面を開く(失敗データ再送モード)
SwitchToMessageInputOnlyFailed?.Invoke(_header.SendHistoryId);
}
```
### T_MessageSender.csの既存実装(113-124行目)
```csharp
public void SwitchToMessageInputOnlyFailedRequested(int reSendHistoryId)
{
// _sendTypeを最新の情報に更新
var sendHistoryDto = new SendHistoryDao().GetSendHistory(reSendHistoryId);
_sendType = (Constants.SEND_TYPE)sendHistoryDto.SendType;
// フォームタイトル
SetFormTitle("作成");
// データロード(指定ID内の送信失敗データのみが画面に自動セットされる)
_ucMessageInput.LoadFailedHistory(reSendHistoryId);
// 表示
_ucMessageInput.BringToFront();
}
```
この実装により、送信履歴詳細画面から送信失敗データのみを簡単に再送信できるようになります。