
環境は、Visual Web Developer 2008 Express Editon with C# です。
データベースは、Oracle 10g Express Edition です。
触り始めて、1週間程度ですので、お手やらかに。
次のようなコードで、Oracleから取得した値をテーブルに表示しています。ここでreaderは、System.Data.OracleClient.OracleDataReaderラスのオブジェクト、Menuは、System.Web.UI.WebControls.Tableクラスのオブジェクトです。
while (reader.Read())
{
object[] values = new object[3];
int i = reader.GetOracleValues(values);
TableRow r = new TableRow();
TableCell delcom = new TableCell();
Button delButton = new Button();
delButton.Click += new EventHandler(delButton_Click);
delButton.Text = "削除";
delcom.Controls.Add(delButton);
r.Cells.Add(delcom);
for (int j = 0; j < 3; j++)
{
TableCell cell = new TableCell();
cell.Text = values[j].ToString();
r.Cells.Add(cell);
}
Menu.Rows.Add(r);
}
このコードは、メソッドにして、Page_Loadおよび、delButton_Clickの両メソッドから呼び出しています。
ここで、各行に貼り付けた「削除」ボタンを押すと、1回目では削除されず、2回目で削除されるという現象が起きています。
デバッガで追うと、1回目はdelButton_Clickメソッドが呼ばれず、2回目では呼ばれています。
1回目の表示では、設定したイベントが
色々、調べてみましたが、ちょっとお手上げです。
どのようにすれば、毎回この設定したイベントが有効になるかお知恵を拝借できないでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
当方 VS2005なのですが 動的に作成したボタンイベントも1回目でハンドラへ来ますよ
当方で実験したコードは以下のような感じです
データベースを使わずに 無条件で10個のボタンを作成します
PageのViewStateを使って表示/非表示を切り替えます
protected void Page_Load(object sender, EventArgs e)
{
for (int n = 0; n < 10; n++)
{
TableRow r = new TableRow();
TableCell c = new TableCell();
Button btn;
string ss = String.Format("del{0,2:d}", n);
btn = new Button();
btn.Text = ss;
btn.Font.Name = Table1.Font.Name;
btn.Font.Size = Table1.Font.Size;
btn.Click += new EventHandler(myClick);
if (IsPostBack && !ViewState.IsItemDirty(ss))
{
// ポストバック時にViewStateにアイテムが無いなら非表示
btn.Visible = false;
c.Visible = false;
r.Visible = false;
}
c.Controls.Add(btn);
r.Controls.Add(c);
Table1.Controls.Add(r);
if (!IsPostBack)
{
// 初回のみViewStateに登録
ViewState[ss] = ss;
}
}
}
protected void myClick(object sender, EventArgs e)
{
Button btn = (Button)sender;
// ViewStateからアイテムを削除
ViewState.Remove(btn.Text);
// コントロールを削除
Table1.Controls.Remove(btn.Parent.Parent);
}
といった具合です
PageLoad時に ViewStateを見てコントロールの作成自体をスキップするコードにすると
Clickイベントの引数senderがおかしくなる現象が起きました
たとえば 3番目の『del 2』を削除した後『del 3』を削除しようとした場合『del 4』を削除してしまいます
ここでもう一度『del 3』をクリックすると『del 3』が削除される
といった現象です
GridViewを使ったほうが簡単に実現出来そうですよ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mp3の埋め込み画像の削除ができ...
-
Yahooフリマってどれくらい時間...
-
VBA:Openステートメントで開い...
-
告白してフラれた相手の連絡先...
-
ダブルクォーテーションの削除...
-
【エクセル】セル内の右側のみ...
-
エクセルで住所の混在する「丁...
-
もう関わりたくない人がいたらL...
-
エクセルの右クリックで行削除...
-
今日の日付が過ぎたらその行を...
-
動的に生成したボタンのイベン...
-
指定した文字があった場合、そ...
-
Windows11に残されたWindows10...
-
nProtectの削除について(PSO2削除)
-
喧嘩をしてLINE削除され、 また...
-
エクセルVBAで行削除時にエラー...
-
教えてgooの裏事情
-
エクセルで下の空白行を削除したい
-
保険屋がファミレスで煩いと言...
-
Googleフォトでバックアップを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Yahooフリマってどれくらい時間...
-
指定した文字があった場合、そ...
-
VBA:Openステートメントで開い...
-
告白してフラれた相手の連絡先...
-
もう関わりたくない人がいたらL...
-
Windows11に残されたWindows10...
-
nProtectの削除について(PSO2削除)
-
アクセスにおいて間違って削除...
-
喧嘩をしてLINE削除され、 また...
-
バッチファイルを使用したsql@p...
-
エクセルVBAで行削除時にエラー...
-
mp3の埋め込み画像の削除ができ...
-
メーリングリストから特定の人...
-
ATMに登録されている振込先を削...
-
Adobe AcrobatのPDFのページ削除
-
【エクセル】セル内の右側のみ...
-
Googleフォトでバックアップを...
-
gooIDを 誤って削除してしまい...
-
(Access)複数条件の重複デー...
-
今日の日付が過ぎたらその行を...
おすすめ情報