C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[14]: ASP.NET DetailsView配置したFormVie


(過去ログ 118 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■69224 / inTopicNo.1)  ASP.NET DetailsView配置したFormVie
  
□投稿者/ とし (1回)-(2013/12/10(Tue) 10:29:52)

分類:[.NET 全般] 

ASP.NET初心者です。
DetailsView のInsertItemTemplateに配置したFormViewの値を取得したいのですがどうしてもわかりません
DetailsViewの挿入機能を使って登録画面を作成しています。
InsertItemTemplateに配置したテキストボックスにコードを入力後FormViewにACCESSのマスタから入力したコードの名称を表示しています。
表示する所まで出来たのですが
挿入ボタンをクリックしても名称が登録されない状態です。
@FormViewの値を認識させてパラメータを渡す方法
AFormViewの値を挿入前に取得してNEWパラメータとしてセットしたいが値の取得が出来ないので値の取得方法
@かAどちらでもいいので解決策を教えて頂きたいです。

基本は
InsertItemTemplateに配置したテキストボックスにコードを入力後次のテキストボックスにACCESSのマスタから入力したコードの名称をセットする方法があれば
いいのですが・・・

説明不足がわかりませんが
宜しくお願い致します。

引用返信 編集キー/
■69230 / inTopicNo.2)  Re[1]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (109回)-(2013/12/10(Tue) 14:45:42)
No69224 (とし さん) に返信
> ASP.NET初心者です。
> DetailsView のInsertItemTemplateに配置したFormViewの値を取得したいのですがどうしてもわかりません
> DetailsViewの挿入機能を使って登録画面を作成しています。

なぜ DetailsView の中に FormView を実装しなければならないのですか? そういう
実装は時分は初めて聞きます。 DropDownList でよさそうな気がしますけど。

どうしても FormView でなければならないなら、取得したい「FormView の値」がその
FormView のパブリックプロパティから取得できないと、データバインド式(<%# 文字と
%> 文字で囲む式)では取得できません。

たぶん、FormView の中に配置した TextBox や Label などのコントロールの値を取得
したいのだと思いますが、その場合はデータソースコントロール(SqlDataSource な
ど)の Inserting イベントか DetailsView の ItemInserting イベントで、DetailsView
の中の FormView を探し、さらに探し当てた FormView の中から目的のデータを持って
いる TextBox や Label などのコントロールをさがし、そのパブリックプロパティ(Text
など)から値を取得し、それをパラメータに設定するという方法を取ることになります。

それが実際にできるかどうかは、今提供されている情報だけでは分かりません。

> InsertItemTemplateに配置したテキストボックスにコードを入力後FormViewにACCESSのマスタから入力したコードの名称を表示しています。

それなら DropDownList でよさそうに思えます。以下のページのような感じでできるので
はないですか?

DetailsView 中の連動 DropDownList
http://surferonwww.info/BlogEngine/post/2010/12/04/Dual-DropDownLists-in-DetailsView.aspx

> 説明不足がわかりませんが

その通りです。分かっておられるなら最初からきちんと書いていただければと思います。

まずご自分の環境(OS, .NET, IIS のバージョンやブラウザに何を使っているかなど)を
書いてください。

それから、特に初心者の方は、分からない部分だけでなく、何をしたいのかの全体のシナ
リオを質問に含めて書くことをお勧めします。 そうしていただければ、よりスマートで
簡単な方法の提案もできるかもしれません。

引用返信 編集キー/
■69234 / inTopicNo.3)  Re[2]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (2回)-(2013/12/10(Tue) 17:25:36)
No69230 (WebSurfer さん) に返信
> ■No69224 (とし さん) に返信
>>ASP.NET初心者です。
>>DetailsView のInsertItemTemplateに配置したFormViewの値を取得したいのですがどうしてもわかりません
>>DetailsViewの挿入機能を使って登録画面を作成しています。
>
> なぜ DetailsView の中に FormView を実装しなければならないのですか? そういう
> 実装は時分は初めて聞きます。 DropDownList でよさそうな気がしますけど。
>
> どうしても FormView でなければならないなら、取得したい「FormView の値」がその
> FormView のパブリックプロパティから取得できないと、データバインド式(<%# 文字と
> %> 文字で囲む式)では取得できません。
>
> たぶん、FormView の中に配置した TextBox や Label などのコントロールの値を取得
> したいのだと思いますが、その場合はデータソースコントロール(SqlDataSource な
> ど)の Inserting イベントか DetailsView の ItemInserting イベントで、DetailsView
> の中の FormView を探し、さらに探し当てた FormView の中から目的のデータを持って
> いる TextBox や Label などのコントロールをさがし、そのパブリックプロパティ(Text
> など)から値を取得し、それをパラメータに設定するという方法を取ることになります。
>
> それが実際にできるかどうかは、今提供されている情報だけでは分かりません。
>
>>InsertItemTemplateに配置したテキストボックスにコードを入力後FormViewにACCESSのマスタから入力したコードの名称を表示しています。
>
> それなら DropDownList でよさそうに思えます。以下のページのような感じでできるので
> はないですか?
>
> DetailsView 中の連動 DropDownList
> http://surferonwww.info/BlogEngine/post/2010/12/04/Dual-DropDownLists-in-DetailsView.aspx
>
>>説明不足がわかりませんが
>
> その通りです。分かっておられるなら最初からきちんと書いていただければと思います。
>
> まずご自分の環境(OS, .NET, IIS のバージョンやブラウザに何を使っているかなど)を
> 書いてください。
>
> それから、特に初心者の方は、分からない部分だけでなく、何をしたいのかの全体のシナ
> リオを質問に含めて書くことをお勧めします。 そうしていただければ、よりスマートで
> 簡単な方法の提案もできるかもしれません。
>

WebSurferさんありがとうございます。

そうですね申し訳ありません
環境は
OS XP
IIS:V6.0
IE10
Microsoft Visual Web Developer 2010 Expressで開発しています。

現在ACCESSで使用しているシステムをWEBに作り変えています。

ACCESSの時はコードを入力したらマスタのコード名称をVLOOKUPで名称を表示していたので
同じ感じで作りたかったので・・・(コードのみ入力で登録のため)
コード・名称は両方とも登録アイテム

入力コードは3つで各々マスタ3つ参照していました。
1つのマスタはコードが12000件登録されています。

回答をみてかなり難しそうですね
VLOOKUPみたいに名称をテキストボックスに設定することは不可能なのでしょうか?
出来ない場合はDropDownListにチャレンジしてみます。
引用返信 編集キー/
■69242 / inTopicNo.4)  Re[3]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (112回)-(2013/12/10(Tue) 19:47:37)
No69234 (とし さん) に返信
> 入力コードは3つで各々マスタ3つ参照していました。
> 1つのマスタはコードが12000件登録されています。

マスタというのは Access データベースのテーブルのことですか? その 3 つ
のテーブルのそれぞれに「コード」と「名称」というフィールドを持つレコード
が 12,000 あるということですか?

そうだとするとそれをそのまま DropDownList に表示するのは実用的ではありま
せん。

DropDownList を使うとすれば、例えば DropDownList を複数使って「大分類」⇒
「中分類」⇒「小分類」というように絞り込んでいって(下記ページの例参照)、
DropDownList に表示するのを 10 〜 20 項目にできる場合です。

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

でも、ユーザーに 12,000 件から選択させるなんて、FormView を使ってどうやる
のですか? 12,000 件のコード・名称リストをユーザーに渡して、それを見て
その中なら一つ選んでコードを入力しろと言っているわけではないですよね? 
そのあたりが解決できているなら、何かやり方はありそうな気がします。

とにかく、FormView で選択して表示するところまでできているなら、先のレスで
書いた回答をベースにやってみてはいかがですか。分からない点があれば質問して
ください。


# OS XP とのことですが、それは開発マシンですよね。XP をサーバーに使うのは
#無理です。また、XP の IIS は 5.1 のはずです。
引用返信 編集キー/
■69260 / inTopicNo.5)  Re[4]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (3回)-(2013/12/12(Thu) 14:49:27)
No69242 (WebSurfer さん) に返信
> ■No69234 (とし さん) に返信
>>入力コードは3つで各々マスタ3つ参照していました。
>>1つのマスタはコードが12000件登録されています。
>
> マスタというのは Access データベースのテーブルのことですか? その 3 つ
> のテーブルのそれぞれに「コード」と「名称」というフィールドを持つレコード
> が 12,000 あるということですか?
>
> そうだとするとそれをそのまま DropDownList に表示するのは実用的ではありま
> せん。
>
> DropDownList を使うとすれば、例えば DropDownList を複数使って「大分類」⇒
> 「中分類」⇒「小分類」というように絞り込んでいって(下記ページの例参照)、
> DropDownList に表示するのを 10 〜 20 項目にできる場合です。
>
> CascadingDropDown Demonstration
> http://www.asp.net/AjaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx
>
> でも、ユーザーに 12,000 件から選択させるなんて、FormView を使ってどうやる
> のですか? 12,000 件のコード・名称リストをユーザーに渡して、それを見て
> その中なら一つ選んでコードを入力しろと言っているわけではないですよね? 
> そのあたりが解決できているなら、何かやり方はありそうな気がします。
>
> とにかく、FormView で選択して表示するところまでできているなら、先のレスで
> 書いた回答をベースにやってみてはいかがですか。分からない点があれば質問して
> ください。
>
>
> # OS XP とのことですが、それは開発マシンですよね。XP をサーバーに使うのは
> #無理です。また、XP の IIS は 5.1 のはずです。

WebSurfer さんありがとうございます。

返信が遅くなりまして申し訳ありません

すみません
サーバOS:2003Serverです

見てその中なら一つ選んでコードを入力
ではなく現在は
コード TextBox(コードを入力したら)
名称  FormView(名称をLabel表示)
の仕様です。


DetailsViewの内容を記載します。

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="受付,SAP場所,工程ID,コード" DataSourceID="AccessDataSource1"
Height="50px" Width="251px" oniteminserted="DetailsView1_ItemInserted">
<Fields>

 中略

<asp:TemplateField HeaderText="コード" SortExpression="コード">
<EditItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Eval("コード") %>'></asp:Label>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="Koumoku_Code" runat="server" Text='<%# Bind("コード") %>'
ontextchanged="Koumoku_Code_TextChanged"
ondatabinding="Koumoku_Code_DataBinding" AutoPostBack="True"></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label8" runat="server" Text='<%# Bind("コード") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="名称" SortExpression="名称">
<EditItemTemplate>
<asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("名称") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="Name" runat="server" Text='<%# Bind("名称") %>'></asp:TextBox>
<asp:FormView runat="server" DataSourceID="AccessDataSource2"
style="font-size: small" ID="FormView1"
ondatabound="FormView1_DataBound"
onitemdatabound="Koumoku_Name_ItemDataBound">

<EditItemTemplate>
項目名称:
<asp:TextBox ID="項目名称TextBox" runat="server" Text='<%# Bind("項目名称") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
CommandName="Update" Text="更新" />
&nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
</EditItemTemplate>
<InsertItemTemplate>
項目名称:
<asp:TextBox ID="名称1TextBox" runat="server" Text='<%# Bind("名称1") %>' />
<br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
CommandName="Insert" TabIndex="-1" Text="挿入" />
&nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
</InsertItemTemplate>
<ItemTemplate>
&nbsp;<asp:Label ID="項目名称Label" runat="server" Text='<%# Bind("項目名称") %>' />
<br />
</ItemTemplate>
</asp:FormView>
<asp:AccessDataSource ID="AccessDataSource2" runat="server"
DataFile="D:\・・・\マスタ.mdb"
SelectCommand="SELECT [名称1] FROM [マスタ(ALL)] WHERE (([区分] = ?) AND ([コード] = ?))">
<SelectParameters>
<asp:SessionParameter Name="区分" SessionField="LaboKbn" Type="String" />
<asp:SessionParameter Name="コード" SessionField="Code" Type="String" />
</SelectParameters>
</asp:AccessDataSource>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label9" runat="server" Text='<%# Bind("名称") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Button" ShowInsertButton="True" InsertText="登録" />
</Fields>
</asp:DetailsView>


InsertItemTemplateで設定
画面イメージ
受付  TextBox
 ・   ・
 ・   ・
コード TextBox
名称  TextBox(FormViewの名称が取得出来たらセットするために残してある)Bindしている
    FormView(上記コードをキーにコードが入力されたら名称を表示している)

当初FormViewの値が取得できれば
e.NewValues("名称") = name
で挿入前にセットしようと考えていたので
名称のTextBoxは削除してFormViewで作成

※名称が挿入されるか確認のために
名称  TextBox
作成しました。


VBソース(値取得)
試しにやってみたのは
Dim row As DetailsViewRow = DetailsView1.Rows(8)
Dim name As String = row.Cells(0).Text
これだと
名称(アイテム名)は取得できました
Rows(8)Cells(1)
だと表示しない

(CType(DetailsView1.FindControl("FormView1"), FormView)).Text
(CType(DetailsView1.FindControl("FormView1"), FormView)).Label
とかも試したけどダメでした。
(TextはFormViewのメンバではありません、LabelはFormViewのメンバではありません)

WebSurferさんに教えていただいた
DetailsViewの中の FormView を探し、さらに探し当てた FormView の中から目的のデータを持って
いる TextBox や Label などのコントロールをさがし、そのパブリックプロパティ(Text
など)から値を取得し、それをパラメータに設定するという方法を取ることになります。
のやり方になるのでしょうか?


コード TextBox(コードを入力したら)
名称  TextBox(マスタの名称をセット)
する良い方法はないでしょうか?

Webで良くみる郵便番号を入力して住所を入力フオームにセットしているのはどうやっているのか?
あんな感じで作りたいのです。
引用返信 編集キー/
■69261 / inTopicNo.6)  Re[5]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (118回)-(2013/12/12(Thu) 17:51:53)
No69260 (とし さん) に返信

コードは詳しく見てません(必要最小限にしてもらえないと、すみませんが、とても
長いコードは見る気が起きません)ので、ハズレかもしれませんが・・・

> (CType(DetailsView1.FindControl("FormView1"), FormView)).Text
> (CType(DetailsView1.FindControl("FormView1"), FormView)).Label
> とかも試したけどダメでした。
> (TextはFormViewのメンバではありません、LabelはFormViewのメンバではありません)

「TextはFormViewのメンバではありません」と書いてある通りです。(FormView には
Text というプロパティはありません)

(CType(DetailsView1.FindControl("FormView1"), FormView)) は FormView1 オブジ
ェクトになるはずです。それには Text プロパティはありません。

FormView1 オブジェクトを取得したら、その中に配置した TextBox や Label を再度
FindControl で探して取得し、その Text プロパティで目的の値を取得できませんか?

先のレスをよく読んでください。「・・・さらに探し当てた FormView の中から目的
のデータを持っている TextBox や Label などのコントロールをさがし・・・」と書
いたはずです。

> Webで良くみる郵便番号を入力して住所を入力フオームにセットしているのはどうやっているのか?
> あんな感じで作りたいのです。

自分がやるなら FormView は使いません。郵便番号と住所の TextBox を DetailsView
に直接配置します。

Web サーバー側には、郵便番号のデータを受けて住所を返す Web サービス(または WCF)
を実装します。

ブラウザ上で、ユーザーが郵便番号の入力を完了したタイミングで、jQuery AJAX 等を
利用して Web サービス に郵便番号 TextBox から住所データを取得して送信し、Web サ
ービスから返ってきた住所データを、住所 TextBox に書き込むという感じです。

引用返信 編集キー/
■69263 / inTopicNo.7)  Re[6]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (120回)-(2013/12/12(Thu) 18:08:52)
追伸です。

ご参考までに、jQuery AJAX と ASP.NET Web サービスの利用例を書いたページを紹介しておきます。

jQuery AJAX と Web サービス
http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx
引用返信 編集キー/
■69274 / inTopicNo.8)  Re[7]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (4回)-(2013/12/13(Fri) 16:59:02)
No69263 (WebSurfer さん) に返信
> 追伸です。
>
> ご参考までに、jQuery AJAX と ASP.NET Web サービスの利用例を書いたページを紹介しておきます。
>
> jQuery AJAX と Web サービス
> http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx

WebSurferさんありがとうございます。

返事が遅くなりました。

FormView1 オブジェクトを取得したら、その中に配置した TextBox や Label を再度
FindControl で探して取得
にチャレンジしましたが・・・

FormView1 オブジェクトを取得はこんな感じでいいのでしょうか?
Dim name As Control = DirectCast(sender, Control).FindControl("FormView1")
Dim name As FormView = CType(DetailsView1.FindControl("FormView1"), FormView)

TextBox や Label を再度FindControl で探して取得
この取得がどのようにFindControlを指定するかがわからず悩んでいます。
Dim tb8 As TextBox = CType(name.FindControl("名称Label"),Label)
ではダメでした。

わかりましたら教えて頂きたいです。
宜しくお願い致します。
引用返信 編集キー/
■69275 / inTopicNo.9)  Re[8]: ASP.NET DetailsView配置したFormVie
□投稿者/ an (16回)-(2013/12/13(Fri) 17:58:07)
No69274 (とし さん) に返信

> FormView1 オブジェクトを取得はこんな感じでいいのでしょうか?
> Dim name As Control = DirectCast(sender, Control).FindControl("FormView1")
> Dim name As FormView = CType(DetailsView1.FindControl("FormView1"), FormView)
 
これは同じ名前の変数が2つありますが、
2パターン確認したという事でしょうか?
(通常同じ名前の変数が2つあったらエラーになりますので・・・)

また「こんな感じでいいのでしょうか?」とはどういう意味でしょうか?
「両方とも正常に動作したが、一般的な書き方としてどちらが正しいか?」という意味でしょうか?


当方ASP環境がないため、動作確認等ができませんので、
曖昧な書き方になってしまうので、一つ手順を提示します。

上記コードですが、1行で複数の事を行っているので、
仮にどこかに問題があってもわかりにくくなってしまいます。
もし仮に上記例が正常に動作していないのであれば、
最初は極力1行1処理にすべきと思います。
(理解したらある程度はまとめてよいとは思いますが。)

例えば

> Dim name As Control = DirectCast(sender, Control).FindControl("FormView1")
Dim name1 As Control = DirectCast(sender, Control)     '引数senderをControl型にキャスト
Dim name2 As Control = name1.FindControl("FormView1")  'name1から"FormView1"という名前のコントロールを取得

> Dim name As FormView = CType(DetailsView1.FindControl("FormView1"), FormView)
Dim name1 As Control = DetailsView1.FindControl("FormView1")  'DetailsView1から"FormView1"という名前のコントロールを取得
Dim name2 As FormView = CType(Name1, FormView)                'name1をFormView型にキャスト

こうすることにより、どこまで正常に動作したかが分かりやすくなると思います。

ちなみにCType、DirectCastはどちらもキャストしてくれますが、
多少動作が異なります。(DirectCastの方がより厳密)
詳細は
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet26/vb6tonet26_03.html
を参照してみてください。



> TextBox や Label を再度FindControl で探して取得
> この取得がどのようにFindControlを指定するかがわからず悩んでいます。
> Dim tb8 As TextBox = CType(name.FindControl("名称Label"),Label)
> ではダメでした。

これはNGです。
TextBox型の変数にLabel型にキャスト(CType)したものを代入しようとしても
型が一致しないのでコンパイルエラーになると思います。
Labelコントロールを取得した場合は、ラベル型の変数に設定するようにしてください。

ちなみにこれも処理の分割をすると
Dim xxx As Control = name.FindControl("名称Label")
Dim tb8 As TextBox = CType(xxx, Label)
のようになり、2行目がコンパイルエラーとなると思います。



引用返信 編集キー/
■69278 / inTopicNo.10)  Re[8]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (122回)-(2013/12/13(Fri) 21:27:27)
No69274 (とし さん) に返信
> TextBox や Label を再度FindControl で探して取得
> この取得がどのようにFindControlを指定するかがわからず悩んでいます。

実際に試していませんのでハズレかもしれませんが、以下(コードは C# です)の
ようにして TextBox に入力された値を取得できませんか?

FormView fv = (FormView)DetailsView1.FindControl("FormView1");
TesxtBox tb = (TextBox)fv.FindControl("TextBox1");
string s = tb.Text;


#自分的には VB は全くお勧めでないです。できるなら C# を勉強するのがよろし
#いかと。
引用返信 編集キー/
■69315 / inTopicNo.11)  Re[9]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (5回)-(2013/12/16(Mon) 14:29:01)
No69278 (WebSurfer さん) に返信
> ■No69274 (とし さん) に返信
>>TextBox や Label を再度FindControl で探して取得
>>この取得がどのようにFindControlを指定するかがわからず悩んでいます。
>
> 実際に試していませんのでハズレかもしれませんが、以下(コードは C# です)の
> ようにして TextBox に入力された値を取得できませんか?
>
> FormView fv = (FormView)DetailsView1.FindControl("FormView1");
> TesxtBox tb = (TextBox)fv.FindControl("TextBox1");
> string s = tb.Text;
>
>
> #自分的には VB は全くお勧めでないです。できるなら C# を勉強するのがよろし
> #いかと。

WebSurferさんありがとうございます。
教えていただいたソースをVBに変換して実行してみました。

FormView fv = (FormView)DetailsView1.FindControl("FormView1");
TextBox tb = (TextBox)fv.FindControl("TextBox1");
string s = tb.Text;
↓VB変換
Dim fv As FormView = DirectCast(DetailsView1.FindControl("FormView1"), FormView)
Dim tb As TextBox = DirectCast(fv.FindControl("名称TextBox"), TextBox)
Dim s As String = tb.Text

オブジェクト参照がオブジェクト インスタンスに設定されていません。
とエラーになりました。

どうやらtbの中身がNullが原因かな?と思い
名称TextBoxが間違っていると判断して
名称を表示しているID名を調べました。

どうやらFormView1は表示しているだけなので
TextBoxではなくItemTemplateの名称Labelと思い
Dim fv As FormView = DirectCast(DetailsView1.FindControl("FormView1"), FormView)
Dim tb As Label = DirectCast(fv.FindControl("名称Label"), Label)
Dim s As String = tb.Text

に変更して実行しましたが
結果は同じでした。

名称が表示されたWebの画面でソースの表示で開いてみましたが
id="DetailsView1_FormView1_名称Label">あああああ</span>
名称Labelとなっていました。

Dim tb As Label = DirectCast(fv.FindControl("名称Label"), Label)
の書き方がダメなのでしょうか?
何度もすみませんが宜しくお願い致します。


#Cのお勧めありがとうございます。
Webの開発を始める時に
VBか#Cか悩んだのですが
社内のほかのWebシステムをみたらVBだったのでとりあえずVBで始めました。
引用返信 編集キー/
■69318 / inTopicNo.12)  Re[10]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (132回)-(2013/12/16(Mon) 16:27:59)
No69315 (とし さん) に返信
> FormView fv = (FormView)DetailsView1.FindControl("FormView1");
> TextBox tb = (TextBox)fv.FindControl("TextBox1");
> string s = tb.Text;
> ↓VB変換
> Dim fv As FormView = DirectCast(DetailsView1.FindControl("FormView1"), FormView)
> Dim tb As TextBox = DirectCast(fv.FindControl("名称TextBox"), TextBox)
> Dim s As String = tb.Text
>
> オブジェクト参照がオブジェクト インスタンスに設定されていません。
> とエラーになりました。
>
> どうやらtbの中身がNullが原因かな?と思い
> 名称TextBoxが間違っていると判断して
> 名称を表示しているID名を調べました。

どうやら・・・というあいまいなことではなくて、どの行で何が null(VB.NET は Nothing)
になっているか調べてください。デバッガを使えば簡単に分かるはずです。

たぶんデバッガを使ったことがないと思いますが、そうであれば基本的なところだけでいい
のでデバッガの使い方を勉強して、使えるようになってください。デバッガを使えないと開
発はおぼつかないです。全ての話はデバッガが使えるようになってからです。
引用返信 編集キー/
■69319 / inTopicNo.13)  Re[10]: ASP.NET DetailsView配置したFormVie
□投稿者/ an (17回)-(2013/12/16(Mon) 16:39:46)
No69315 (とし さん) に返信

※ASPの環境ができたので、確認してみました。
 ただしAccessはないので、DataTableで仮に行ってみました。


> ↓VB変換
> Dim fv As FormView = DirectCast(DetailsView1.FindControl("FormView1"), FormView)
> Dim tb As TextBox = DirectCast(fv.FindControl("名称TextBox"), TextBox)
> Dim s As String = tb.Text
> 
> オブジェクト参照がオブジェクト インスタンスに設定されていません。 
> とエラーになりました。

どの行でエラーが発生したのでしょう?
どの行かによって話が変わるので、
極力詳しく書きましょう。
(たぶん3行目?)


上記エラーの原因としてはいくつかあるようです。
1つめとしては、
 
> Dim tb As TextBox = DirectCast(fv.FindControl("名称TextBox"), TextBox)
> Dim tb As Label = DirectCast(fv.FindControl("名称Label"), Label)

No69260 のASPXファイルを参照したところ、「名称TextBox」と「名称Label」はありません。
あるのは

 <asp:TextBox ID="項目名称TextBox" runat="server" Text='<%# Bind("項目名称") %>' />
 <asp:TextBox ID="名称1TextBox" runat="server" Text='<%# Bind("名称1") %>' />
 <asp:Label ID="項目名称Label" runat="server" Text='<%# Bind("項目名称") %>' />

のいずれかでしょうか?
IDプロパティを一致させる必要があります。

2つ目については、
FormViewからFindControlする場合は、表示しているモードが関係しているようです。
(デフォルトだと表示のみ?)
表示のみの状態だと、FormViewのItemTemplateの中身しかFindControlできないようです。
他のコントロールを参照したければモードを変える必要があるようです。


上記2点について、
FindControlを行うためのサンプルプログラムを作りました。
「☆」の部分のコメントアウトを1行ずつ戻して確認してみてください。
取得できたものだけDebugPrintされます。

(当方環境はVB2008です。)
(あくまでFindControlの確認のためのプログラムなので、
 雑な作りになっているので鵜呑みしないでください。)
(ASPXについては、基本は提示されているものを使用し、
 余計な部分をそぎ落としつつ、ちょい修正しています。)


【Default.aspx】
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication1._Default" %>

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

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>無題のページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblHeader" runat="server">header</asp:Label>
    
        <asp:DetailsView ID="DetailsView2" runat="server" Height="50px" Width="125px" AutoGenerateRows="false">
            <Fields>
                <asp:TemplateField HeaderText="col1" >
                    <ItemTemplate>
                        <asp:Label ID="lblCol1" runat="server" ><%#Eval("col1")%></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="col2">
                    <ItemTemplate>
                        <asp:Label ID="lblCol2" runat="server" ><%#Eval("col2")%></asp:Label>
                        <asp:FormView runat="server" style="font-size: small" ID="FormView1" >
                            <EditItemTemplate>
                                項目名称A:
                                <asp:TextBox ID="項目名称TextBox" runat="server" Text='<%# Bind("項目名称") %>' />
                                <br />
                                <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="更新" />
                                &nbsp;
                                <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                            </EditItemTemplate>
                            <InsertItemTemplate>
                                項目名称B:
                                <asp:TextBox ID="名称1TextBox" runat="server" Text='<%# Bind("名称1") %>' />
                                <br />
                                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" TabIndex="-1" Text="挿入" />
                                &nbsp;
                                <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                            </InsertItemTemplate>
                            <ItemTemplate>
                                項目名称C:
                                <asp:Label ID="項目名称Label" runat="server" Text='<%# Bind("項目名称") %>' />
                                <br />
                            </ItemTemplate>
                        </asp:FormView>
                    </ItemTemplate>
                </asp:TemplateField>
            </Fields>
        </asp:DetailsView>
        <asp:Label ID="lblFooter" runat="server">footer</asp:Label>
    </div>
    </form>
</body>
</html>

【Default.aspx.vb】
Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Me.DetailsView2.DataSource = New DataView(GetDataTable1)
        Me.DetailsView2.DataBind()

        Dim fv As FormView = Me.DetailsView2.FindControl("FormView1")

        '☆
        'fv.ChangeMode(FormViewMode.ReadOnly)
        'fv.ChangeMode(FormViewMode.Insert)
        'fv.ChangeMode(FormViewMode.Edit)

        fv.DataSource = New DataView(GetDataTable2)
        fv.DataBind()

        ContainsDebug(fv)

    End Sub

    Private Function GetDataTable1() As DataTable
        Dim dt As DataTable
        dt = New DataTable
        dt.Columns.Add("col1")
        dt.Columns.Add("col2")

        Dim dr As DataRow
        dr = dt.NewRow
        dr.Item(0) = "1-1"
        dr.Item(1) = "1-2"
        dt.Rows.Add(dr)

        Return dt
    End Function
    Private Function GetDataTable2() As DataTable
        Dim dt As DataTable
        dt = New DataTable
        dt.Columns.Add("項目名称")
        dt.Columns.Add("名称1")

        For i As Integer = 1 To 10
            Dim dr As DataRow
            dr = dt.NewRow
            dr.Item(0) = "項目名称(" & i.ToString & ")"
            dr.Item(1) = "名称1(" & i.ToString & ")"
            dt.Rows.Add(dr)
        Next

        Return dt
    End Function

    Private Sub ContainsDebug(ByVal fv As FormView)
        Dim c As Control

        c = DirectCast(fv.FindControl("項目名称TextBox"), Control)
        If c IsNot Nothing Then
            Debug.Print(c.ID)
        End If

        c = DirectCast(fv.FindControl("名称1TextBox"), Control)
        If c IsNot Nothing Then
            Debug.Print(c.ID)
        End If

        c = DirectCast(fv.FindControl("項目名称Label"), Control)
        If c IsNot Nothing Then
            Debug.Print(c.ID)
        End If
    End Sub

End Class
====ここまで===============================


ちなみに

> 名称が表示されたWebの画面でソースの表示で開いてみましたが
> id="DetailsView1_FormView1_名称Label">あああああ</span>
> 名称Labelとなっていました。

これに関してはあくまでHTMLになった時の話なので、
ASPXとは直接は関係ないと思われます。




#蛇足ですが、
#これが解決したところで、郵便番号検索のような事ができるのかが、見えてきません・・・。
#WebSurferさんの No69261 の最後の方に記載されている方法を行う方がスマートそうに思えます。

引用返信 編集キー/
■69328 / inTopicNo.14)  Re[11]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (133回)-(2013/12/17(Tue) 10:57:52)
No69319 (an さん) に返信
> ■No69315 (とし さん) に返信
>>名称が表示されたWebの画面でソースの表示で開いてみましたが
>>id="DetailsView1_FormView1_名称Label">あああああ</span>
>>名称Labelとなっていました。
>
> これに関してはあくまでHTMLになった時の話なので、
> ASPXとは直接は関係ないと思われます。

そうでもないと思います。

ASP.NET のサーバーコントロールでこれに相当するのは、span 要素なので TextBox ではなく
て Label、id (ClientID) から DetailsView1 の中の FormView1 の中の「名称Label」という
ID のサーバーコントロールであろうと言う推定ができます。(下記 URL のページ参照)

であれば、"あああああ" という文字列は Text プロパティから取得できるはずです。ダメな
理由は、どこで null になっているかである程度絞れるのではないかと期待できます。

ASP.NET Web サーバー コントロールの識別
http://msdn.microsoft.com/ja-jp/library/1d04y8ss(v=vs.100).aspx
引用返信 編集キー/
■69332 / inTopicNo.15)  Re[12]: ASP.NET DetailsView配置したFormVie
□投稿者/ an (18回)-(2013/12/17(Tue) 11:49:37)
No69328 (WebSurfer さん) に返信
> ■No69319 (an さん) に返信
>>■No69315 (とし さん) に返信
> >>名称が表示されたWebの画面でソースの表示で開いてみましたが
> >>id="DetailsView1_FormView1_名称Label">あああああ</span>
> >>名称Labelとなっていました。
>>
>>これに関してはあくまでHTMLになった時の話なので、
>>ASPXとは直接は関係ないと思われます。
>
> そうでもないと思います。
>
> ASP.NET のサーバーコントロールでこれに相当するのは、span 要素なので TextBox ではなく
> て Label、id (ClientID) から DetailsView1 の中の FormView1 の中の「名称Label」という
> ID のサーバーコントロールであろうと言う推定ができます。(下記 URL のページ参照)
>
> であれば、"あああああ" という文字列は Text プロパティから取得できるはずです。ダメな
> 理由は、どこで null になっているかである程度絞れるのではないかと期待できます。
>
> ASP.NET Web サーバー コントロールの識別
> http://msdn.microsoft.com/ja-jp/library/1d04y8ss(v=vs.100).aspx

言葉足らずですみません。
 ASPXで「今回FindControlで取得するしようとする件として」は直接は関係ないと思われます。
という意味でした。
また、「直接関係ない」という意味としては
 HTML上に出力された「DetailsView1_FormView1_名称Label」をASPX側(サーバーサイド)で指定してもダメです
という意味です。

HTML上にしゅつりょくされたIDはコンテナされた項目の名前が連なるようなので、
もちろん関係はあるのですが、
これに拘るよりはASPX側(サーバーサイド)の処理を注視してほしいと思って記載しました。

確かにWebSurferさんがおっしゃる通り、
推定、期待はできますね。

混乱させてしまい、申し訳ありませんでした。
訂正させていただきます。

引用返信 編集キー/
■69339 / inTopicNo.16)  Re[11]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (6回)-(2013/12/17(Tue) 16:40:59)
No69318 (WebSurfer さん) に返信
> ■No69315 (とし さん) に返信
>>FormView fv = (FormView)DetailsView1.FindControl("FormView1");
>>TextBox tb = (TextBox)fv.FindControl("TextBox1");
>>string s = tb.Text;
>>↓VB変換
>>Dim fv As FormView = DirectCast(DetailsView1.FindControl("FormView1"), FormView)
>>Dim tb As TextBox = DirectCast(fv.FindControl("名称TextBox"), TextBox)
>>Dim s As String = tb.Text
>>
>>オブジェクト参照がオブジェクト インスタンスに設定されていません。
>>とエラーになりました。
>>
>>どうやらtbの中身がNullが原因かな?と思い
>>名称TextBoxが間違っていると判断して
>>名称を表示しているID名を調べました。
>
> どうやら・・・というあいまいなことではなくて、どの行で何が null(VB.NET は Nothing)
> になっているか調べてください。デバッガを使えば簡単に分かるはずです。
>
> たぶんデバッガを使ったことがないと思いますが、そうであれば基本的なところだけでいい
> のでデバッガの使い方を勉強して、使えるようになってください。デバッガを使えないと開
> 発はおぼつかないです。全ての話はデバッガが使えるようになってからです。

WebSurferさん anさん 親切にありがとうございました。

エラーは
Dim s As String = tb.Text
が赤文字になっていました。

色々助言ありがとうございます。

FormViewの値を取るのは難しいみたいですね


元々は登録画面で
コード TextBox(コードを入力したら)
名称  Label(マスタ名称をLabelに表示)
が理想で作ってました。
FormViewを使ったのは上記の様にItemTemplateでマスタ名称をLabelにセットする方法が分からなかったからです。

DropDownListを使用する場合は作成していたのでですが
登録画面で見た目がこんな感じになったので・・・
コード TextBox(コードを入力したら)
名称  Label▼(マスタ名称をDropDownListで取得してLabelに設定して表示)
DropDownListを最小にして▼だけ

Dim tb9 As Label
Dim name As DropDownList

name = CType(DetailsView1.FindControl("DropDownList2"), DropDownList)

tb9 = CType(DetailsView1.FindControl("Koumoku_name"), Label)
tb9.Text = name.Text

見た目は置いておいてDropDownListでやろうと思います。

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

WEBで登録画面を作成する時にテキストボックスにコードを入力して
テキストボックスやラベルに名称をマスタから設定する事はないのでしょうか?
色々検索したんですけど探せなかったです。(探し方が悪いのか)

最後に
社内では、ACCESSで作成した物はコード入力して名称表示(VLOOLUP使用)している物が多く
これから作成の参考にしたいので教えて頂ければ助かります。(参考になるURLでも良いですが・・・)
引用返信 編集キー/
■69343 / inTopicNo.17)  Re[12]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (134回)-(2013/12/17(Tue) 17:41:16)
No69339 (とし さん) に返信
> ■No69318 (WebSurfer さん) に返信
>>■No69315 (とし さん) に返信
> エラーは
> Dim s As String = tb.Text
> が赤文字になっていました。

まだデバッガを使えてないようですね。赤文字になるというのはブラウザに表示
されたエラーメッセージだと思いますが、それはデバッガではありません。

くどいようですがデバッガを使えないと開発なんてできません。使えないと、今
後出てくる問題も原因が分からず諦めるということになるかもしれませんよ。

FormView を止めるのはともかく(もともと FormView を使うべきではないので)、
原因を究明するという姿勢はスキルアップに大事だと思いますので、時間がある
ときまた原因を調べてみることをお勧めします。

DropDownList も使い方が変です。それも止めて、TextBox 2 つと Button 1 つ
でいいのではないですか。

一つ目の TextBox にコードを入力して Button をクリックしたらポストバック
をかけて、一つ目の TextBox に入力されたコードでサーバー側で Access のテ
ーブルを検索して、検索結果を 2 つめの TextBox に表示するようなことはでき
ると思いますが。
引用返信 編集キー/
■69353 / inTopicNo.18)  Re[13]: ASP.NET DetailsView配置したFormVie
□投稿者/ とし (7回)-(2013/12/18(Wed) 16:39:08)
No69343 (WebSurfer さん) に返信
> ■No69339 (とし さん) に返信
>>■No69318 (WebSurfer さん) に返信
> >>■No69315 (とし さん) に返信
>>エラーは
>>Dim s As String = tb.Text
>>が赤文字になっていました。
>
> まだデバッガを使えてないようですね。赤文字になるというのはブラウザに表示
> されたエラーメッセージだと思いますが、それはデバッガではありません。
>
> くどいようですがデバッガを使えないと開発なんてできません。使えないと、今
> 後出てくる問題も原因が分からず諦めるということになるかもしれませんよ。
>
> FormView を止めるのはともかく(もともと FormView を使うべきではないので)、
> 原因を究明するという姿勢はスキルアップに大事だと思いますので、時間がある
> ときまた原因を調べてみることをお勧めします。
>
> DropDownList も使い方が変です。それも止めて、TextBox 2 つと Button 1 つ
> でいいのではないですか。
>
> 一つ目の TextBox にコードを入力して Button をクリックしたらポストバック
> をかけて、一つ目の TextBox に入力されたコードでサーバー側で Access のテ
> ーブルを検索して、検索結果を 2 つめの TextBox に表示するようなことはでき
> ると思いますが。

WebSurferさんありがとうございます。

デバッガの助言ありがとうございます。
最初から使おうと思って使ったのですが
F5を押すとエラーで止まるので諦めてました。
エラーをなくしてから使う様にしたいと思います。

TextBox に入力されたコードでサーバー側で Access のテーブルを検索して、
検索結果を 2 つめの TextBox に表示するようなことはできると思いますが。

私も出来ると思うのですが何をどうすれば実現出来るかが全然分からないんです。
なので前に参考になるURLがあればと書いた次第です。

色々と長い間ありがとうございました。
また、分からない事があれば質問させて頂きますのでその時は、お力をお貸し頂ければ幸いです。
引用返信 編集キー/
■69354 / inTopicNo.19)  Re[14]: ASP.NET DetailsView配置したFormVie
□投稿者/ WebSurfer (136回)-(2013/12/18(Wed) 17:48:52)
No69353 (とし さん) に返信
> また、分からない事があれば質問させて頂きますのでその時は、お力をお貸し頂ければ幸いです。

それまでに入門書などを読んで、実際にサンプルなどを作って、ASP.NET Web アプリ開発
に必要な基本的な知識を体系的に勉強されることをお勧めします。

今のような、何でもいいからできればいいというコードですと、どこかに予期できない問題
を含んでいたり、他人が保守する際訳が分からなくてお手上げということにもなりかねませ
んので。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -