none
2つのFormViewの連動について RRS feed

  • 質問

  • 左右に2つのFormViewを配置しています。

    左側のFormView1に入力された値に応じて該当するレコードを右側のFormView2に表示させようとしています。
    具体的には、左側には会社名や電話番号などの顧客情報を入力し、その左側で入力されたデータのうち会社名の値に応じて右側のFormViewに四季報のような企業情報から該当する会社の情報が表示されるようにしたいと考えています。

    どうすれば一番効率よくできるかアドバイスをいただけますか?

    一応わかりやすく説明できるか不安ですが自分でやってみた方法を追記いたします。

    まず最初に以下のようにFormView2の方の会社名の値(列名;C70)をFormView1.selectedvalueと連動させる方法を考えたのですが、FormViewの場合はselectedvalueがIDになるので断念しました。


     <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
           
        SelectCommand="SELECT * FROM [shoko_company_db] WHERE ([C70] LIKE '%' + @C70 + '%')">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="FormView1" Name="C70"
                    PropertyName="SelectedValue" Type="String" />
                        </SelectParameters>
                    </asp:SqlDataSource>

    次にFormViewの外にダミーのTextBox1をおいてTextBox経由で連動させる方法を試しました。
    FormViewのPageIndexが変わったら会社名の値(列名;F7)の値をTextBox1.Textに代入し、、、

        Private Sub FormView1_PageIndexChanged(sender As Object, e As System.EventArgs) Handles FormView1.PageIndexChanged

            System.Threading.Thread.Sleep(100)
            Me.TextBox1.Text = DirectCast(Me.FormView1.Row.FindControl("F7TextBox"), TextBox).Text
             End Sub

    あとは以下のようにTextBox1.textとFormView2の会社名(列名;C70)を連動させました。

     <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
           
        SelectCommand="SELECT * FROM [shoko_company_db] WHERE ([C70] LIKE '%' + @C70 + '%')">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="TextBox1" Name="C70"
                    PropertyName="Text" Type="String" />
                        </SelectParameters>

    そうすると一応はできたのですが連動する値にずれが生じてしまうときが多いことがわかりこの方法も断念しました。たとえばFormView1を次へ次へとクリックしてもたまにFormView2には一つ前の会社情報が表示される。
    System.Threading.Thread.Sleep(100)のように待ち時間を設定しても改善しませんでした。

    どうすれば一番よいかアドバイスをいただけますでしょうか?
    よろしくお願いいたします。

     

     

    2013年8月2日 1:35

回答

  • 何となくやりたいことが分かったような気がします。

    以下のようになっていて、

    FormView1: SELECT [ID], [会社名], [担当者名] FROM [会社テーブル]

    FormView2: SELECT [ID], [会社名], [従業員数] FROM [企業情報テーブル] WHERE ([会社名] = @会社名)

    FormView1 のページを変更するたびに、FormView1 と FormView2 の [会社名] が同じになるようにしたいが、現状では FormView2 には変更する前の [会社名] のレコードが表示されるということですか? 要するに同期を取りたいということですか?

    であれば、

    (1) FormView1 の DataBound イベントで [会社名] の TextBox を探して Text プロパティから会社名を取得し、FormView2 に DataBind をかける。

    (2) FromView2 の SqlDataSource の Selecting イベントで、引数の SqlDataSourceSelectingEventArgs オブジェクトから SqlCommand オブジェクトを取得してパラメータに (1) で取得した会社名を入力することで可能なはずです。

    以下のような感じです(あくまで「感じ」です。よく考えて自分のコードにしてください)。

    string companyName = "";
    
    protected void FormView1_DataBound(object sender, EventArgs e)
    {
        TextBox tb = (TextBox)((FormView)sender).FindControl("会社名TextBox");
        companyName = tb.Text;
        FormView2.DataBind();
    }
    
    protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        e.Command.Parameters["@会社名"].Value = companyName;
    }


    FromView2 の SqlDataSource の SelectParameters は以下のようにします。

    <SelectParameters>
        <asp:Parameter Name="会社名" Type="String" />
    </SelectParameters>

    ところで、Thread.Sleep() は何の意味もないです。よく考えましょう。
    • 編集済み SurferOnWww 2013年8月5日 8:56 一部追加
    • 回答としてマーク tosaito3 2013年8月6日 2:48
    2013年8月5日 8:55

すべての返信

  • まず最初に以下のようにFormView2の方の会社名の値(列名;C70)をFormView1.selectedvalueと連動させる方法を考えたのですが、FormViewの場合はselectedvalueがIDになるので断念しました。

    会社名を元にしてlikeで検索されているようですが、一般的にはこのようなことをしません。同じ会社名が存在しないと言い切れるのでしょうか?また、関連会社の場合、同じ文字列が共通で含まれる可能性があります。会社を一意に識別するIDで、検索するようにすべきだと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年8月2日 1:47
    モデレータ
  • 基本的なやり方が疑問ですので、まず、そのあたりを確認させてください。

    > 左側のFormView1に入力された値に応じて該当するレコードを
    > 右側のFormView2に表示させようとしています。

    FormView の使い方が間違ってませんか?

    「左側」はユーザーに入力させる顧客情報だそうですが、であれば、FormView ではなく普通の TextBox か、一覧を表示してユーザーに選択させるなら DropDownList とか GridView を使うのが普通だと思いますが。

    そして、ユーザー入力が完了したら、何らかの手段でポストバックし、ユーザーが入力した顧客情報からデータベースから該当する企業情報のレコードを取得して、「右側」の FormView に表示するというのが普通だと思います。

    何故「左側」も「右側」も FormView なのですか?

    2013年8月2日 2:20
  • さっそくありがとうございます。

    確かにおっしゃるとおりでLIKEで会社名の文字列検索をするのはベストな選択ではないです。企業情報を提供している会社が配番しているユニークなIDを使用して検索するように書き換えようと思います。

    2013年8月2日 3:18
  • ありがとうございます。

    確かに一個一個TextBoxやDropDownListを配置して入力フォームを構成するすれば、簡単に実現できる話ですが、今回FormViewを使用したのは以下の理由からです。

    FormViewを使うとページングや更新ボタン・新規ボタン等もすぐに作成されて便利。

    項目が大量にあり一個一個配置すると時間がかかる。

    なおFormViewのDefaultModeをEditやInsertにしておいて入力・編集フォームとして使用するのは想定されている使い方だと思っていましたが皆さんはあまりそういった使い方はしていないのでしょうか。

    2013年8月2日 3:41
  • > FormViewを使うとページングや更新ボタン・新規ボタン等もすぐに作成されて便利。
    >
    > 項目が大量にあり一個一個配置すると時間がかかる。

    ぜんぜんイメージが湧きません。

    上記は「左側のFormView1」でユーザーに「会社名や電話番号などの顧客情報を入力」してもらうためのものですよね。「項目が大量にあり一個一個配置すると時間がかかる」ほど多くの入力項目があるのですか? それほど多くの項目をユーザーが間違いなく TextBox に入力することを期待してアプリを作ることは、自分的にはあり得ないのですが。

    項目が多ければ、DropDownList などを複数配置して、ユーザーに選択させながら絞り込んでいくようにするのが普通だと思います。例えば以下のような感じです。

    CascadingDropDown Demonstration
    http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx

    何にせよ、今提供されている情報だけでは何がどうなっているのか分かりませんので、可能であれば、回答者が状況を理解できる必要最小限のコードをアップしてください。

    2013年8月2日 5:09
  • ご返信ありがとうございます。

    左側のFormView1は88項目もあり、右側のFormView2は108項目あります。入力項目が多いのは仕方がないのでDropDownListで選択制にしたり、会社名などはAutoCompleteExtenderを使って一部の文字列を入れるだけで候補がでるようにしています。

    それぞれ違うテーブルをバインドしている2つのFormViewをそれぞれに含まれる主キーではない共通の項目(企業コードや会社名など)で連動させるよい方法はないでしょうか?

    というのが質問になります。同じテーブルをバインドしているGridViewとDetailsViewなどでIDを使って連動させている例はよくありますが同じようなことをしようとしています。

    項目が多すぎてコードが無駄に長いので来週にでもサンプルコードを作成して掲載いたしますので引き続きよろしくお願いします。

    2013年8月2日 6:18
  • > それぞれ違うテーブルをバインドしている2つのFormViewをそれぞれに含まれる
    > 主キーではない共通の項目(企業コードや会社名など)で連動させるよい方法は
    > ないでしょうか?

    回答者にとってはこのスレッドで提供されている情報がすべてです。今提供されている情報だけでそれが答えられるはずはないことは理解されているでしょうか?

    サンプルコードをアップする際は、どのような情報を提供すれば回答者が質問者さんの状況を把握して問題点を認識でき、質問者さんの求める回答ができるか、十分考えて書いていただくようお願いします。

    2013年8月2日 7:33
  • それぞれ違うテーブルをバインドしている2つのFormViewをそれぞれに含まれる主キーではない共通の項目(企業コードや会社名など)で連動させるよい方法はないでしょうか?

    ここは私が回答した後、気になっていました。以下、話をわかりやすくするために、左側に表示されるテーブルを会社テーブル、右側に表示されるテーブルを企業情報テーブルとします。
    さて、左側の入力して登録する会社は、必ず右側に表示される企業情報テーブルにあるのでしょうか?あれば、企業情報テーブルを会社マスターにしてしまえば良いと思います。つまり、左側の会社情報は手で入力するのではなく、企業情報テーブルから選択する形になります。よって、会社テーブルには企業情報テーブルのIDを持ち、会社名などの情報は持ちません。
    もし、必ずしも企業情報テーブルに無いのであれば、会社名などを手入力し、参考情報、つまり右側を表示するために、企業情報テーブルのIDを持ちます。

    2つのテーブルを紐づけるわけですから、何らかの外部キーが必ず必要になります。その外部キーは会社テーブルに持つか、もしくは他のテーブルを用意してそこに持つかになります。後者は1:多で紐づく時は必須になりますが、今回は1対1の紐づけですので、会社テーブルに外部キーとして企業情報テーブルのIDを持つだけで十分でしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年8月2日 7:42
    モデレータ
  • trapemiya さん>

    質問者さんには来週サンプルコードをアップする際に十分な情報を提供していただくようお願いしていますので、詳しい話はその後のよいのではないでしょうか。

    テーブルのスキーマの変更も視野に含めてレスされているように思えますが、それが妥当かどうか今の時点では分からないと思います。たとえ妥当であっても、質問者さんに権限がないなどの理由ででできないかもしれません。

    その場合、他の回答者を含めて、混乱を招くことになるのではと思います。

    2013年8月2日 11:53
  • SurferOnWww さん>

    おそらくSurferOnWwwさんは、FormViewを使わないことも視野に入れ、アプリケーションとして完成度の高いものを目指して回答されようとしているように思います。ですから、サンプルコードを求められたのだと思います。それを否定するつもりはありませんし、質問者さんがよりよい勉強ができるのであれば何よりだと思います。
    ただ、現時点で私はそこまで考えて回答していないという違いがあります。私が最も注目しているのは、データベースからどのようにデータを取り出し、そのためにはどのような設計をすべきかということです。会社名をlike検索して2つのテーブルの関係を結ぶのは、正直、基礎的な勉強が足りていないと考えました。
    サンプルコードがどのようなものになるのかはわかりませんが、少なくとも質問者さんは、

    >それぞれ違うテーブルをバインドしている2つのFormViewをそれぞれに含まれる主キーではない共通の項目(企業コードや会社名など)で連動させるよい方法はないでしょうか?

    という質問をされており、それに対してピンポイントで回答をしていると私は思っています。この質問内容はタイトルと同じであり、質問者さんは相変わらず適切な回答を得られていないという証です。質問者さんが何を求めて質問しているのか?それを考えて、自分のできることをできる範囲内でできるだけ早く回答し、時に誘導しているつもりです。
    おそらく今回の件は、2つのFormViewの連携がずれるという問題と、データベースの扱いという2つの大きな問題があります。前者はサンプルコードが有効でしょうが、後者はサンプルコードとは関係ないテーブルの設計に関する部分ですので、そこだけ質問者さんが悩んでおられるところに先に回答しました。結果的にこれが解決に向かう時間の短縮になると思ったからです。

    >テーブルのスキーマの変更も視野に含めてレスされているように思えますが、それが妥当かどうか今の時点では分からないと思います。

    と書かれていますが、私は妥当を保障して回答しているわけではありません。決していい加減ではなく、全ての回答を妥当を確信してから行うのは実質的に不可能だと考えるからです。質問者さんとのやり取りの中で、時に実は、ずれている回答をすることは誰でもありうることだと思いますし、その繰り返しがより妥当な回答へ結び付く手段になることも多々あると思うからです。

    >たとえ妥当であっても、質問者さんに権限がないなどの理由ででできないかもしれません。

    確かにできない可能性はありますが、以上の理由により、これに関してもそこまで考慮に入れていません。権限がなく、テーブル設計の変更ができない場合は一変して妥当な回答ではなくなりますが、そうだとしても、このようなケースでは一般的にどう解決するのかが勉強できたという観点では妥当な回答になると思います。逆に、そこはどうしても知っておいてもらいたい、それを伝えたいという私の思いがあります。それが結果的に、サンプルコードを見てSurferOnWwwさんが回答する際の参考にもなるとも思ったのですが、混乱を招くと考えられたのであれば、私の配慮が足りなかったのかもしれませんね。

    (追記)
    SurferOnWwwさんが回答する際の参考にもなると書いたのは、質問者さんがどのようなデータを用意されていて、それをどのように扱いたいかが少しでも明確になり、参考になるという意味です。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年8月2日 13:24
    モデレータ
  • trapemiya さん>

    質問者さんは「来週にでもサンプルコードを作成」とのことで、あまり急いでないようです。そういう状況で部分的な回答をしたり、想定で回答したりするより、情報を入手してからピンポイントで回答した方がいいと思います。

    何故なら、間違った方向に進んでしまうと、元に戻すのが結構大変で、他の回答者・閲覧者を含めて混乱を招くことになる可能性があるからです。

    2013年8月3日 2:23
  • SurferOnWwwさん>

    私は少しかもしれませんが、正しい方向に進む回答をしたつもりです。外部キーのない2つのテーブルを連携させるには、どうすれば良いでしょうか?という質問に、外部キーを作るしかないですよという回答をしました。しかし、SurferOnWwwさんが言われているように、スキーマの変更はできない状況かもしれません。その時は、残念ながら回答としては誤った方向を向いていたことになります。でもその時はまた正しいと思われる方向に修正して、回答すればよいだけではないでしょうか? 一発で回答に結びつかなくても、そういう流れなら混乱は出ないと思います。
    また、ピンポイントの回答だけが良いとは限らないと思います。もし、スキーマの変更ができないのであれば、現時点でどのような回答になるのかはわかりませんが、少なくとも私の外部キーに関して述べた回答を見ることは質問者さんはないでしょう。それは、私には残念なことに映ります。

    本当に質問者さんの力になりたいと思っているのであれば、私に限らず、書きたい人が自由に書き込めば良いのではないでしょうか? その回答は少なくとも間違った方向に向いている思って書かれているものではないでしょう。しかし、それが不幸にも誤った方向に向いているのであれば、また正しい方向に導く回答を誰かがすれば良いだけではないでしょうか? 正しい方向に導くために書かれた多くの回答はフォーラムの資産となり、フォーラムを閲覧しているみなさんにとって役立つものになると思います。

    ただ、SurferOnWwwさんが心配されていることもよくわかります。SurferOnWwwさんのような回答の方がうれしいと思う人ももちろんいるでしょう。直接回答せず、勉強してもらうように回答へ導くスタイルの回答者もいらっしゃいます。そういう場合に横から直接回答をするのは失礼ですが(質問者が困惑していない場合)、常識的に問題なければ、いろいろな回答が出てくることは、私にはプラス面の方が多いように思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年8月4日 15:39
    モデレータ
  • trapemiya さん>

    話が噛み合ってないようです。

    質問者の方がいろいろな可能性を検討するために、複数の回答者がいろいろな提案をすることはフォーラムとしてあるべき姿だと思います。そこのところは多分同じ認識かと思います。

    自分は、質問者さんは「来週にでもサンプルコードを作成」とのことで、あまり急いでないようですから、「いろいろな提案をする」のはそれまで待ってはいかが、と言っています。

    モデレータ、MVP という肩書きを持つ方の回答はかなりの影響力がありますので、質問者さんによっては、頭からそれが唯一の正しい道だと信じて、そちらの方向に進んでいってしまう可能性のあることも配慮していただければと思います。

    2013年8月5日 1:01
  • SurferOnWwwさん>

    これ以上、質問に直接関係ない話題をここでするわけにはいきませんので、この件に関する私の発言はこれで最後にします。今回の発言は、この議論について総括し、結論付けたつもりです。もし、まだ話を続けるのであれば、どうしましょうか?「MSDN / TechNet フォーラムへのご意見ご要望」辺りしか思い浮かばないのですが・・・。

    >自分は、質問者さんは「来週にでもサンプルコードを作成」とのことで、あまり急いでないようですから、「いろいろな提案をする」のはそれまで待ってはいかが、と言っています。

    サンプルコードを見なければわからないところは、その通りだと思います。私も通常はそうすると思います。想定して回答することは負担が大きいからです。ですから、私の今回の回答も、想定で回答しているつもりはありません。外部キーの話は、サンプルコードとは直接関係ない、十分具体的な質問だと思って回答していますし、今のところ私の回答が混乱を与えるとは思っていません。少なくとも質問者さんは外部キーの知識が無いと思いましたので、それを伝えたかっただけです。SurferOnWwwさんがサンプルコードのやり取りをされている流れの中で、補足という意味合いで回答しています。データベースに関することはサンプルコードの流れとは別のことだと思ったからです。

    もし、SurferOnWwwさんが、いや、その回答はサンプルコードを見なければわからないのに、想定に基づいた、混乱を与える回答だと思われているのであれば、そこが会話がかみ合わない根本なのでしょう。もしそうであれば、先にも書きましたが、受け止める人によって変わることもある思いますので、どちらが正解ということはないと思いますので、これ以上議論しても意味がないように思います。ただ、そうであっても、先にも書きましたが、いろいろなスタイルの回答者がいらっしゃいますので、そこは認め合っていくしかないように思います。

    モデレータ、MVPの回答はそれなりの信頼度で見られることはもちろん把握していますので、唯一の正解だと思われないような意識もしており、できるだけ他の方法や、できるだけ多くの種類の回答を探し、参考URLを掲載するようにしているつもりです。もちろん、今回の回答もそれを意識しています。外部キーの件に関しては、とりあえず鉄板の回答をしたつもりです。
    ただ、そうは言っても、私の全ての回答の中には、それができていないことや、不十分なこともあると思います。その際は、勝手ながらSurferOnWwwさんや他の回答者の方のフォローをお願いしたいと思います。実際には、質問者さんもMVPの回答を採用するのではなく、ちゃんと正しい目で一番良い回答を選ばれる方が多いので、私も極端なプレッシャーを感じて回答をしなくてもよく、助かっているんですけどね。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年8月5日 4:20
    モデレータ
  • お世話になっております。

    最初にサンプルコードを元に質問するべきでした。申し訳ありません。

    会社名で名寄せ(あいまいな入力データと企業DBとのマッチング)をすることを主な目的としています。辞書でわからない単語を調べるのと似ていてFormView2の方は辞書に相当し、ほぼ全企業のマスターデータといってもよいのですが、外資系企業の一部など存在しないものもごくわずかにあります。

    会社テーブルの方に企業情報テーブルの方と紐づけるためのIDを持たせる方法は最初にやってみました。

    IDは誰も覚えていないので、企業情報テーブルの会社名をドロップダウンリストで選択するようにして実際の値はIDになるようにしたのですが、選択肢が数万件あるので選ぶのが大変で、AutoCompleteExtenderもドロップダウンリストには使えないので使い勝手が悪すぎて断念しました。DevExpress.comのComboboxの以下の機能を使ったらできたのですが予算が下りずに断念しました。

    http://demos.devexpress.com/ASPxEditorsDemos/ASPxComboBox/LargeDataSource.aspx

    とりあえず、2つのFormViewを連動したいという当初に質問に立ち返って、label.textを介して実現しようとするサンプルを作りましたので以下に掲載いたします。1個ずつずれる点をのぞくとだいたい実現できています。ずれないようにする方法をピンポイントで教えていただけると助かります。。。

    <%@ Page Language="VB" %>

    <%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        Private Sub FormView1_PageIndexChanged(sender As Object, e As System.EventArgs) Handles FormView1.PageIndexChanged
            System.Threading.Thread.Sleep(1000)
            Me.Label1.Text = DirectCast(Me.FormView1.Row.FindControl("会社名TextBox"), TextBox).Text
        End Sub


    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
     
       
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="SELECT [ID], [会社名], [担当者名] FROM [会社テーブル]">
            </asp:SqlDataSource>
          
           
                           
            <br />
            <asp:FormView ID="FormView1" runat="server" AllowPaging="True"
                DataSourceID="SqlDataSource1" DefaultMode="Edit"
                >
                <EditItemTemplate>
                    ID:
                    <asp:Label ID="IDLabel1" runat="server" Text='<%# Eval("ID") %>' />
                    <br />
                    会社名:
                    <asp:TextBox ID="会社名TextBox" runat="server" Text='<%# Bind("会社名") %>' />
                   
                    <br />
                    担当者名:
                    <asp:TextBox ID="担当者名TextBox" runat="server" Text='<%# Bind("担当者名") %>' />
                    <br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
                        CommandName="Update" Text="Update" />
                    &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="Cancel" />
                </EditItemTemplate>
                <ItemTemplate></ItemTemplate>
                <InsertItemTemplate></InsertItemTemplate>
               
            </asp:FormView>
            <asp:FormView ID="FormView2" runat="server" DataSourceID="SqlDataSource2">
               
               
                <EditItemTemplate>
                    ID:
                    <asp:Label ID="IDLabel1" runat="server" Text='<%# Eval("ID") %>' />
                    <br />
                    会社名:
                    <asp:TextBox ID="会社名TextBox" runat="server" Text='<%# Bind("会社名") %>' />
                    <br />
                    従業員数:
                    <asp:TextBox ID="従業員数TextBox" runat="server" Text='<%# Bind("従業員数") %>' />
                    <br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
                        CommandName="Update" Text="Update" />
                    &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="Cancel" />
                </EditItemTemplate>
                <InsertItemTemplate>
                    会社名:
                    <asp:TextBox ID="会社名TextBox" runat="server" Text='<%# Bind("会社名") %>' />
                    <br />
                    従業員数:
                    <asp:TextBox ID="従業員数TextBox" runat="server" Text='<%# Bind("従業員数") %>' />
                    <br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
                        CommandName="Insert" Text="Insert" />
                    &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="Cancel" />
                </InsertItemTemplate>
               
               
                <ItemTemplate>
                    ID:
                    <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />
                    <br />
                    会社名:
                    <asp:Label ID="会社名Label" runat="server" Text='<%# Bind("会社名") %>' />
                    <br />
                    従業員数:
                    <asp:Label ID="従業員数Label" runat="server" Text='<%# Bind("従業員数") %>' />
                    <br />

                </ItemTemplate>
            </asp:FormView>
            <asp:SqlDataSource ID="SqlDataSource2" runat="server"
                ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="SELECT [ID], [会社名], [従業員数] FROM [企業情報テーブル] WHERE ([会社名] = @会社名)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="Label1" Name="会社名" PropertyName="Text"
                        Type="String" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:Label ID="Label1" runat="server" Text="Label" style="color: #FFFFFF"></asp:Label>
            <br />
           
        </div>
        </form>
    </body>
    </html>

    よろしくおねがいします。

    2013年8月5日 5:23
  • 1 個ずつずれるというのが具体的にどういうことなのか分かっていませんが・・・

    PageIndexChanged のタイミングが問題なのでは?

    FormView1_PageIndexChanged メソッドの中にブレークポイントを設定してデバッガで Me.Label1.Text を見てください。それがズレていれば FormView2 の方のレコードもずれるのは当たり前のような気がします。

    PageIndexChanging のタイミングでやったらどうなりますか?


    #問題とは関係ないですが Ajax Control Toolkit を使うなら、ScriptManager ではなく、ToolkitScriptManager を使いましょう。


    • 編集済み SurferOnWww 2013年8月5日 7:19 誤字訂正
    2013年8月5日 6:45
  • ご返信ありがとうございます。そうでした。ToookkitScriptManagerを使用するようにします。

    PageIndexChangingのタイミングで実行しても同じで一つ前の値になってしまいます。

    デバッガでみると一つ前の値になっています。次のデータに更新されてから値を取得したいのですがうまくできません。

    Timerのように遅れて実行させることができないかやってみます。System.Threading.Thread.Sleep(1000)だと全部とまってしまうので意味がありませんでした。

    よろしくお願いします。

    2013年8月5日 7:39
  • 何となくやりたいことが分かったような気がします。

    以下のようになっていて、

    FormView1: SELECT [ID], [会社名], [担当者名] FROM [会社テーブル]

    FormView2: SELECT [ID], [会社名], [従業員数] FROM [企業情報テーブル] WHERE ([会社名] = @会社名)

    FormView1 のページを変更するたびに、FormView1 と FormView2 の [会社名] が同じになるようにしたいが、現状では FormView2 には変更する前の [会社名] のレコードが表示されるということですか? 要するに同期を取りたいということですか?

    であれば、

    (1) FormView1 の DataBound イベントで [会社名] の TextBox を探して Text プロパティから会社名を取得し、FormView2 に DataBind をかける。

    (2) FromView2 の SqlDataSource の Selecting イベントで、引数の SqlDataSourceSelectingEventArgs オブジェクトから SqlCommand オブジェクトを取得してパラメータに (1) で取得した会社名を入力することで可能なはずです。

    以下のような感じです(あくまで「感じ」です。よく考えて自分のコードにしてください)。

    string companyName = "";
    
    protected void FormView1_DataBound(object sender, EventArgs e)
    {
        TextBox tb = (TextBox)((FormView)sender).FindControl("会社名TextBox");
        companyName = tb.Text;
        FormView2.DataBind();
    }
    
    protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        e.Command.Parameters["@会社名"].Value = companyName;
    }


    FromView2 の SqlDataSource の SelectParameters は以下のようにします。

    <SelectParameters>
        <asp:Parameter Name="会社名" Type="String" />
    </SelectParameters>

    ところで、Thread.Sleep() は何の意味もないです。よく考えましょう。
    • 編集済み SurferOnWww 2013年8月5日 8:56 一部追加
    • 回答としてマーク tosaito3 2013年8月6日 2:48
    2013年8月5日 8:55
  • ありがとうございます。非常に助かりました。

    なるほどこうやればよかったのですね。 希望どうりFormView1と2で常に同じ会社のレコードが表示されるようになりました。

    Partial Class demo
        Inherits System.Web.UI.Page
        Dim CompanyName As String
        Protected Sub FormView1_DataBound(sender As Object, e As System.EventArgs) Handles FormView1.DataBound
            CompanyName = DirectCast(Me.FormView1.Row.FindControl("会社名TextBox"), TextBox).Text
            FormView2.DataBind()
        End Sub
        Protected Sub SqlDataSource2_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource2.Selecting
            e.Command.Parameters("@会社名").Value = CompanyName
        End Sub
    End Class

    2013年8月6日 2:52