ASP.Netイベント関数内でクラッシュエラーが発生する理由

このQ&Aのポイント
  • ASP.Netのイベント関数内でFormView.ItemUpdating関数を呼び出すことはできないため、クラッシュエラーが発生します。
  • FormView.ItemUpdating関数を呼び出すためにはキャストエラーを修正する必要があります。正しい引数を指定してください。
  • FormView.ItemUpdating関数の仕様上、呼び出すことができないため、要件を満たすことはできません。
回答を見る
  • ベストアンサー

ASP.Net イベント関数内で・・・

大変お世話になっております。 大変申し訳ございません。突拍子もない質問になるのもしれませんが、 例えば DropDownList の SelectedIndexChanged TextBox のTextChanged などのイベント関数の中で、FormView.ItemUpdating 関数は呼び出せないものでしょうか? Call で呼び出すのですが、ByVal e As FormViewUpdateEventArgs 部分の引数の部分でキャストが合わない等のエラーが発生します。 もともと呼び出せない仕様になっているのでしょうか? これが呼び出せれば、入力後、検証コントロールで排除できなかった入力を元に戻せるのですが、仕様を無視した質問だったでしょうか? 何卒よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.3

> TextBox のTextChangedイベントが実行されてしまうと、値を元に戻せないので、ItemUpdating メソッドが使えるのかなと思った次第であります。 これはなんか考え方がおかしいです。 検証コントロールは使っていて、そこでの検証に問題はない。 その状態でTextChangedイベントがあがってくる。 入力された内容で検証コントロール以外のチェックを行ったうえでデータの格納等を行いたい。 こういう状態だと認識しましたがあってますか? であれば、TextChangedイベントの中で最終的にやりたいデータの格納等の前に、データ内容の チェックを行なう処理を記述して、その後元の状態でエラーをつけて再度ページを表示するのか、 データを格納するなどして先にすすむのか、このあたりも自分でプログラムを記述することに なります。 たぶんAccess側のプログラムだと一画面についてデータを格納するかどうかを一箇所で 記述できるのでしょうが、ASP.NET側はそういう仕組みになっていません。 それぞれのコントロールに対してイベントを記述するので、そのイベントの中で必要な処理を 書いていくことになります。 Accessからの移植ということで同じようにしたい、というのはわかりますが、そこに とらわれているためにこのようなフレームワークや用意されたコントロールに合わない プログラムを書こうとして遠回りというか無駄な時間を使っているように思えます。 ASP.NETでの一連のデータの処理の仕方、というのを学習されることをおすすめします。

kyokotan12
質問者

お礼

onosさん お世話になります。 確かに自身で考えていくうちに、このやり方はASP.Net に適さないとだんだんわかってきました。隠しコントロールを作成し、ダミーのコントロールでTextChangedイベントで運用検証を行い、値が適さなかったら隠しコントロールの値を戻すような形で進めていこうと思います。 ご指摘どおりAccessの時の考え方にとらわれ過ぎておりました。 この時点で考え方を変えてみたいとおもいます。 ありがとうございました。

その他の回答 (2)

  • WebSurfer
  • ベストアンサー率55% (33/59)
回答No.2

> 例えば DropDownList の SelectedIndexChanged > TextBox のTextChanged などのイベント関数の中で、 > FormView.ItemUpdating 関数は呼び出せないものでしょうか? それに何の意味があるのかというのはとりあえず置いといて・・・ イベントハンドラと言えどメソッドですから、アクセス修飾子が許す範囲ならどこからでも呼び出せます。 エラーが出るのは、呼び出す際にメソッドの引数に代入する変数の型が合わないからでしょう。

kyokotan12
質問者

補足

WebSurferさん お世話になります。 TextBox のTextChanged などのイベント関数の中でFormView.ItemUpdating 関数は呼び出す意味ですが、TextBoxの変更時にその値が検証コントロール以外で運営的にその値が不正だった場合に値を元に戻す事が目的なのですが、そもそもそういう使い方はできないのでしょうか?もし、そのような使い方ができるのでしたら、是非使いたいのです。 FormView.ItemUpdatingの引数ですが、ByVal e As FormViewUpdateEventArgs の部分の引数ですが、FormViewUpdateEventArgs.Empty を入れてみたのですが、エラーが出てしまいます。正しい変数の型とはこの場合どんな型で、データであるべきでしょうか? むちゃくちゃな質問なのかもしれませんが、もしお教えいただけますと大変助かる次第であります。

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

そもそもの考え方になにか違ったところがあるよーな。。。 何をどうしたいのか、を整理して書いてみてもらえませんか? ItemUpdatingメソッドを呼び出すことを前提にしていますが、その前提ではなく、 そもそも何をしたいのか、がわかればそれを実現するための方法、考え方を 提示することもできると思います。 たぶん、コントロールとしてのFormViewは、通常のプログラム中から ItemUpdatingメソッドが呼び出されることは想定していないと思います。 #フレームワークから呼び出されたときに動作を変更するためにItemUpdatingが  用意されている、という感じじゃないかと。 入力されたデータで検証がからんでるのはわかりますが、そこでどのような データをどう処理したいのか、をきちんと整理してみてください。

kyokotan12
質問者

補足

onosさん お世話になります。 現在Accessで作成されているシステムを自分なりにASP.Netに作り変えているところであります。Accessで言うところのBeforeUpDateイベント(入力されたデータを検証し、運営的に問題がある場合キャンセルできる 元に値に戻せる)と同じことができないかなと、以前質問をさせていただき、使えるイベントとして ItemUpdating の e.Cancel = True でそれが実現できるのかなと思っている次第であります。市販のツールで同じ事ができるコントロールがあるとの情報はいただいているのですが、まずは既存のコントロールやメソッドでそれらが本当に実現できないかと模索しているところでした。 TextBox のTextChangedイベントが実行されてしまうと、値を元に戻せないので、ItemUpdating メソッドが使えるのかなと思った次第であります。 ダミーコントロールを用意して、実際にデータバインドされているコントロールは隠しておいて、ダミーコントロールで検証を行いダメなら隠しコントロールの値を戻すという方法は見つけたのですが、このようなコントロールが多い場合は大変かなと思い、質問させていただいてる状況です。

関連するQ&A

  • ASP.Net TextChangedイベント

    お世話になります。 TextChangedイベントの引数に関しまして教えて下さい。 A ・・・ ボタン B ・・・ テキストボックス Aボタンを押したときのイベントの中に、BのテキストボックスのTextChangedイベントも実行させたいのですが、 Protected Sub A_Click(sender As Object, e As System.EventArgs)     Dim A As Button = FormView1.Row().FindControl("A")     Call B_TextChanged( A , e As System.EventArgs)     Sender は Aボタンでいいと思うのですが、     e As System.EventArgs この部分の e にはどのようなモノを入れればいいでしょうか?     (EventArgs派生クラス) と書いてあるのですが、実際どのように記述すればいいのかわかりません。 End Sub 何卒よろしくお願いいたします。

  • 関数の引数と型

    関数の引数と型 TextBoxに数字しか入力できないようにする関数として Private Function fTextBoxNumberCheck(Byval MyTextBox as TextBoX)As Boolean という宣言文を目にしました。 Q1. Byval MyTextBox これは関数の呼び出し側では実引数としてText1,Text2のようなオブジェクト自体を 渡すことができるということでしょうか? 私の読んでいる入門書では実引数は変数ばかりなので・・・。 Q2. as TextBox これは入門書によれば実引数のデータ型となっていますが 調べてもTextBoxという型はありませんでした。 宣言文は関数のサンプルとして、その前後は記載されていませんでしたが、 どこかにTextBoxの宣言をしてあるはず(?)なのでしょうか? Yesとすればどのように書くのでしょうか?

  • ASP.Net GridView TextBoxで

    大変お世話になります。 FormViewにあるGridView を編集状態にした状態で、 Dim Gv As GridView = FormView1.Row.FindControl("GridView1") TextBoxのデータを変更した際に、他のTextBoxの内容を変更したいのですが、 この場合、GridViewのTextBoxのTextChangedイベントを使用しています。 ここで問題なのが、 (1) GridVew の行の Index の取得 (2) TextChangedイベント内での FindControl の記述の仕方 上記のやり方がよくわかりません。 ボタンを使用した場合の Index の取得などはわかるのですが、 GridView1_RowCreated イベントで Dim A As Button = CType(e.Row.FindControl("A"), Button) A.CommandArgument = e.Row.RowIndex.ToString() 上記(1)、(2)はどうしたらよいのかわかりません。 編集状態にあるGridView の Index の取得方法とローカル関数でのFindCotrol メソッドの やり方など、お分かりになる方がいらっしゃいましたら 何卒ご教授いただければと存じます。

  • 関数呼び出しを制御する関数について

    条件によって異なる関数を呼び出す関数を作成するときに幾つかの疑問を感じました。 例えば、ボタンを入力することによってmake_textbox()という関数(新たなテキストボックスを表示する因数なし戻り値なしの関数)を呼び出したときに、その関数を呼び出す前にグローバル関数の設定を行いたくなって function complex(){    ///新たな関数 x = $('form1'),value; /// グローバル変数の設定($ ← は prototype.jsによる)(form1の値をとる)   make_textbox(); } といったcomplex()関数を作ったのですが、テキストボックスを作ってはくれませんでした。 また、 function make(){ make_textbox(); } といったmake_textboxを呼び出すだけの関数を呼び出してもテキストボックスは生成されませんでした。javascriptは引数を指定することなしにidを指定しさえすれば自由に、入力された値を操作できるので、引数なし戻り値なしの下のような関数を作ってみたのですが、実際これは的確に関数を呼び出せるのでしょうか? function f(){ if($('form1').value == 1){ f(); //例えばf()はテキストボックスに入力された値を配列に入れ替えたりする関数で g(); //g()はその配列で行列地を計算したりなど } h(); } また、もしお時間がございましたら、図々しいようですが下に提示するサンプルソースをご閲覧願います。もしご覧くださるのであれば、300行を超えるhtml&javascriptコード(ひとつ)なのでお時間をとってしまうことになりますから、「スクロールしてみても明らかに間違ってるよ」といえるような箇所をご指摘いただけたらあり難いです。サンプルソースは行列演算に関するもので、.txtファイルをダウンロードする形式になっております。 http://www1.axfc.net/uploader/Sc/so/183286 どうか、以上の私が抱いた疑問を解決して下さればあり難いです。

  • 文字の判定について質問です

    Visual Basicについての質問です。 私は、"Textbox1"に"gakuban"で宣言した文字を入力すると、"Textbox2"に"simei"で宣言した名前を表示させ、それ以外の文字が入力されたらメッセージボックスで"違います"が表示されるプログラムを作りたいと思い、下のようなプログラムを組みました。しかしこれだと、"Textbox1"に文字を1文字入力するたびに"違います"のメッセージボックスが表示されてしまいます。これを直したいのですが、どのようにプログラムを直せばいいのか分かりません。なので、この下のプログラムをどう直せばいいのか教えていただけないでしょうか? Public Class Form1 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Dim gakuban() As String = {"H05001", "H05002", "H05004", "H06007", "H05009"} Dim simei() = {"一郎", "次郎", "三郎", "四郎", "五郎"} Dim i As Integer i = (Array.IndexOf(gakuban, TextBox1.Text)) If i >= 0 Then TextBox2.Text = simei(i) Else MessageBox.Show("違います") End If End Sub End Class

  • C# Session情報からのキャストについて。

    キャストについて質問させて下さい。 C# FormViewでWebフォームを開発しております。 フォームに「カテゴリ」というDropDownListの項目があります。 入力画面を開いた際に、以下のようにSession情報から「カテゴリ」をデフォルト選択状態にしたいです。 ------ protected void Page_PreRenderComplete(object sender, EventArgs e) {    if (Session["Session_Category"] != null)    {       int Session_Category = (int)Session["Session_Category"];       ((DropDownList)FormView1.FindControl("CategoryDropDownList")).SelectedIndex = Session_Category;    } } ------ しかし実行すると、 「int Session_Category = (int)Session["Session_Category"];」の部分で 「指定されたキャストは有効ではありません。」とエラーが出ます。 キャストという事で、大変初歩的なエラーかと恐縮ではありますが、 対処方法をアドバイス頂けないでしょうか? わたくは、SessionとはObject型と認識しておりますが、 どうやったらInt型に変換できるでしょうか? 混乱してきました。 ちなみに、 ・Session["Session_Category"]の値は、必ず1,2,3,4のいずれかの数値が格納されております。 ・「using System.Web.SessionState;」は挿入しております。

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tb" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) Next tb.Text = sum.ToString() Next Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • TemplateFieldで入力制限

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 GridViewではTemplateField内にtxtNVERCHARをtxtDECIMALを作成し、txtDECIMAL入力後に"\999,999"と表示するよう "\"とカンマ編集をおこないたいと思っています。 txtDECIMALのTextChangedイベントを使えばいいのかと思ったのですがどのように記述すればよいかわかりません。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="NO" HeaderText="NO" Visible="False" /></asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> <asp:TextBox ID="txtDECIMAL" runat="server" Text='<%# Bind("ITEM_DECIMAL", "{0:c}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub txtDECIMAL_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Dim textbox As TextBox = DirectCast(sender, TextBox) Dim qty As String = textbox.Text ☆ここからが不明☆ End Sub ---------------------------------

  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

  • コンボボックスからテキストボックスへのデータ反映

    コンボボックスにてデータ(文字列+数字)を選択して、同フォーム内にある テキストボックスへ数字だけを表示させるにはどのようにコードを入力すれば良いでしょうか? VS2010を利用しています。 コンボボックスには、●●会社 00000000000 ▲▲会社 1111111111 といったように登録されております。 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged TextBox1.Text = ComboBox1.Text End Sub 上記のコードですと、文字列+数字がテキストボックスへ反映されてしまいます。 お忙しい中お手数をお掛けしますが、ご教授下さい。

専門家に質問してみよう