none
ListView上のTextBox操作 RRS feed

  • 質問

  • 下の画面下部のListViewの挿入において、「UserID」欄に値が入力されたら、DBを参照し、UserIDからUserNameを取得して「UserName」欄に表示したいのですが、下記が分かりません。

    ・「UserID」欄に入力された値の取得方法
    ・「UserName」欄への値のセット方法

    「UserID」欄が剥き出しになっていれば、TextChangedイベント発生時に、DB参照してテキストボックス「UserName」にセットすれば良いと思うのですが、、、

    ちなみに、TextChangedイベントは下記のようにして拾おうとしていて、拾えているようです。

    protected void UserIDTextBox_TextChanged(object sender, EventArgs e)

    また、「UserID」欄に入力された値を下記で取ろうとしましたが、ダメでした。

    TextBox local_UserIDTextBox = (TextBox)ListView1.InsertItem.FindControl("UserIDTextBox");

    開発環境:
    OS: Windows10 Pro 64 bit
    .NET Framework: 4.5.1
    IIS: 10.0.17763.1
    VIsual Studio: Professional 2017 Version 15.5.9
    Microsoft SQL Server Express (64-bit): 13.0.4224.16 (日本語)

    なお、本質問はスレッド「レコード追加時の強制設定(ListView)」の後の話になります。

    よろしくお願いします。



    • 編集済み Herokey 2019年8月22日 6:54
    2019年8月22日 6:52

回答

  • > ちなみに、TextChangedイベントは下記のようにして拾おうとしていて、拾えているようです。
    > protected void UserIDTextBox_TextChanged(object sender, EventArgs e)

    どうやって確認しているのか分かりませんけど、それが確かであれば・・・

    UserID に該当する InsertTemplate 内のテキストボックス(UserIDTextBox ですよね?)の AutoPostBack プロパティを true に設定してください。そうするとユーザーがそのテキストボックスに UserID 値を入力してフォーカスを外すとポストバックするはずです。

    ポストバックされると当該テキストボックスの TextChanged イベントが発生するので、そのイベントハンドラで 、

    (1) テキストボックスに入力された UserID 値を取得し、

    (2) DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得し、

    (3) それを UserName に該当する InsertTemplate 内のテキストボックスに設定する

    ・・・という操作で望むことができると思います。以下のような感じです。

    protected void UserIDTextBox_TextChanged(object sender, EventArgs e)
    {
        string userId = ((TextBox)sender).Text;
    
        // DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得
    
        ((TextBox)ListView1.InsertItem.FindControl("userNameTextBox")).Text = "上で取得した UserName";
    }

    上のコードの真ん中の「DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得」は自分で考えてください。今提供されている情報ではエスパーでもない限り第三者には分かりませんので。

    • 回答としてマーク Herokey 2019年8月22日 8:26
    2019年8月22日 8:03

すべての返信

  • > ちなみに、TextChangedイベントは下記のようにして拾おうとしていて、拾えているようです。
    > protected void UserIDTextBox_TextChanged(object sender, EventArgs e)

    どうやって確認しているのか分かりませんけど、それが確かであれば・・・

    UserID に該当する InsertTemplate 内のテキストボックス(UserIDTextBox ですよね?)の AutoPostBack プロパティを true に設定してください。そうするとユーザーがそのテキストボックスに UserID 値を入力してフォーカスを外すとポストバックするはずです。

    ポストバックされると当該テキストボックスの TextChanged イベントが発生するので、そのイベントハンドラで 、

    (1) テキストボックスに入力された UserID 値を取得し、

    (2) DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得し、

    (3) それを UserName に該当する InsertTemplate 内のテキストボックスに設定する

    ・・・という操作で望むことができると思います。以下のような感じです。

    protected void UserIDTextBox_TextChanged(object sender, EventArgs e)
    {
        string userId = ((TextBox)sender).Text;
    
        // DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得
    
        ((TextBox)ListView1.InsertItem.FindControl("userNameTextBox")).Text = "上で取得した UserName";
    }

    上のコードの真ん中の「DB に SELECT クエリを投げて取得した UserId 値に該当する UserName を取得」は自分で考えてください。今提供されている情報ではエスパーでもない限り第三者には分かりませんので。

    • 回答としてマーク Herokey 2019年8月22日 8:26
    2019年8月22日 8:03
  • 出来ました!

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

    ((TextBox)sender).Text

    を良く分からないまま、あるWebサイトの見よう見まねで適当に使っていました。(「UserIDTextBox_TextChanged」の頭で「null」をセットしていました)

    ((TextBox)ListView1.InsertItem.FindControl("userNameTextBox")).Text 

    にUserNameをセットすれば良いということが分かりませんでした。

    ASP.NETの勉強の必要性を感じ、「独習ASP.NET」の購入を考えています。

    拾えているのが分かっていたのは、「UserIDTextBox_TextChanged」の中にブレークポイントを設定していたからです。

    2019年8月22日 8:26
  • このスレッドの課題は解決できたようですので改善案などを・・・

    AreaCode, UserID, UserName を INSERT するテーブルの構造を見直すことをお勧めします。

    どういうことかと言うと、例えば以下の画像(Microsoft のサンプルデータベース Northwind の一部)の Products, Categories テーブルのように正規化するということです。Products テーブルと Categories テーブルの CategoryID には FK 制約がかかっています。

    質問者さんの例の AreaCode, UserID, UserName をそれぞれ ProductID, CategoryID, CategoryName に読み替えて上の画像を見てください。

    Products テーブルに CategoryName フィールドを設ける必要はないのが分かりますか? こうしておけば CategoryID と CategoryName の不整合が生じることはありません。また、CategoryName の変更があった場合 Categories テーブルだけ修正すれば済みます。

    質問者さんのテーブルも同様に正規化してはいかがですか?

    そうすると、以下の記事のように DropDownList を使うことができます。

    DropDownList での NULL の処置
    http://surferonwww.info/BlogEngine/post/2015/10/23/dropdpwnlist-handling-null-in-database.aspx



    • 編集済み SurferOnWww 2019年8月23日 0:16 画像張替え訂正
    2019年8月23日 0:08
  • アドバイスをありがとうございます。外部キー制約は未だ使ったことがないので使ってみたいと考えています。
    ただ、今回は、User登録に時間がかかるという業務条件があり、本「AreaCode-UserIDテーブル」登録時に、User登録がされていない場合があります。その為、本「AreaCode-UserIDテーブル」に、UserID=「新規」とUserName=手打ち、を登録する場合があります。その為、正規化するのは難しいと考えました。
    2019年8月23日 2:20