DetailsView内で、DropDownListを2つ配置して連動する方法

このQ&Aのポイント
  • DetailsView内で、2つのDropDownListを配置して連動させる方法を教えてください。
  • 初心者のためわかりやすく書かれたサイトを参考にしましたが、編集時にエラーメッセージが表示されてしまいました。
  • C#のコードをVBに変換してみたものの、'DataRowView'が定義されていないというエラーが出ました。どうすればいいでしょうか。
回答を見る
  • ベストアンサー

DetailsView内で、DropDownListを2つ配置して連動

DetailsView内で、DropDownListを2つ配置して連動させる方法を教えてください。 お世話になります。全くの初心者です。(VisualStudio2005 ASP.NET2.0 ) 質問の仕方も変かもしれませんがご了承ください。 DetailsView内で、DropDownListを2つ配置して,1つ目のDropDownListの項目を選択すると,2つ目のDropDownListで項目が絞られるというのをしたく思っています。 ネットで検索してみましたが、どれもこれも初心者の私には説明が難しすぎて何を書いてあるのかが理解できません。 そんな中で以下のサイトは初心者にもわかりやすく書かれていたので参考にさせて頂いたところ、新規登録はうまく動作するようになったのですが、編集の際にはコードの記述が必要となり作業がとまってしまいました。 http://dotnetfan.org/blogs/dotnetfanblog/articles/737.aspx 記載が必要なコードは以下です。 ネット上にあったコード変換ツールを利用してVBに読み替えてみましたが「型'DataRowView'が定義されていません。」というエラーメッセージが出てしまいます。 何をどうすればいいのかわかりません。 どなたかご教授下さいますようよろしくお願いいたします。 ▼参考サイトでのコード ----------------------------------------------------------------- protected void DetailsView1_DataBound(object sender, EventArgs e) { if (DetailsView1.CurrentMode == DetailsViewMode.Edit) { ((DropDownList)DetailsView1.FindControl("kaList")).SelectedValue = ((DataRowView)DetailsView1.DataItem).Row["kaID"].ToString(); } } ----------------------------------------------------------------- ▼C#⇒VB ----------------------------------------------------------------- Protected Sub DetailsView1_DataBound(sender As Object, e As EventArgs) If DetailsView1.CurrentMode = DetailsViewMode.Edit Then DirectCast(DetailsView1.FindControl("kaList"), DropDownList).SelectedValue = DirectCast(DetailsView1.DataItem, DataRowView).Row("kaID").ToString() End If End Sub -----------------------------------------------------------------

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

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

えっと、Evalとか使ってないはずなので。。。 元のページで「追記」として書いている部分のコードもどこかに記述してたりします? 見た感じだとEvalを使ってるのそのあたりぐらいだし。 #自分で書いたページだけど、もうすっかり内容忘れてるし。

purupuruko
質問者

お礼

ありがとうございます。出来ました。 あんなにも分かり易く丁寧に書いて下さっていたのに、それを読み飛ばして2つ目のドロップダウンリストでもデータをバインドさせていました。ありがとうございました。

その他の回答 (1)

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

エラーからみて、必要な名前空間の追加が行われていない可能性があります。 Import System.Data たぶんコードビハインド側にこんな記述をすれば動くんじゃないかと思います。

purupuruko
質問者

お礼

onos様 早速にご回答下さりありがとうございます。 教えていただいた通り「Imports System.Data」を追記することでエラーメッセージは消えました。ありがとうございました。 …ですが、編集画面で1つ目のDropDownListを変更すると「Eval()、XPath()、および Bind() のようなデータバインド メソッドは、データバインドされたコントロールのコンテキストでのみ使用することができます。」というエラーが出てしまいます。 やはり単純にコードをC#からVBに変換するだけではダメなのでしょうか?

関連するQ&A

  • dropdownlistのvalue値の取得方法について

    VS2005 WinXP pro 下のようにページ表示時にDropDownListに年を入れています。 しかし、DropDownListを何に変更してもSelectedIndexした 値が取れてしまい困っています (今なら常に2008が取れてしまう) 本当なら2009を選択したときは下の関数で 2009と表示したいのです。 お力添えお願いいたします。 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '-------------------------------------------------------------------------------------- ' 年をコンボボックスに追加 '-------------------------------------------------------------------------------------- Dim sNum As Integer = 0 Dim y As Integer For y = 2007 To Year(Now) + 3 cmbYear.Items.Add(New ListItem(y, y)) If y = Year(Now) Then cmbYear.SelectedIndex = sNum ←ここを消すと正しく動く End If sNum += 1 Next End Sub Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEdit.Click '-------------------------------------------------------------------------------------- ' 選択項目の取得 '-------------------------------------------------------------------------------------- MsgBox(cmbYear.Items.Item(cmbYear.SelectedIndex).Value) 2008 MsgBox(cmbYear.SelectedValue) ←2008 どちらも2008 End Sub 以上、よろしくお願い致します。

  • GridView でコンボボックスの設定

    再質問をさせていただきます。 gridviewを作成しました。 -------------------------------------------------------------------------------- <asp:GridView ID="grdList" runat="server" DataSourceID="sqldsList"> <Columns> <asp:BoundField DataField="ITEMNO" HeaderText="ITEMNO"></asp:BoundField> <asp:TextBox ID="txtNAME" runat="server" Text='<%# Bind("ITEM_NAME") %>'></asp:TextBox> <ItemTemplate>   <asp:DropDownList CssClass="cnbstr" ID="cnb_KBN" runat="server"     DataSourceID="sqldscnb1" DataTextField="NAME" DataValueField="NO" AutoPostBack="True"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> -------------------------------------------------------------------------------- このコンボボックスに値を設定させたいのですが、ITEMNO="01"の時だけ、txtNAMEの値を初期表示したいと思っています。 RowDataBound、RowCreatedで可能かと思ったのですができずに困っています。 どなたかご教授お願いします。 Protected Sub grdList_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdList.RowDataBound   If e.Row.RowType = DataControlRowType.DataRow Then     IF DataBinder.Eval(e.Row.DataItem, "ITEMNO").ToString() = "01" THEN       Dim dlist As DropDownList = DirectCast(e.Row.FindControl("cnb_KBN"), DropDownList)       dlist.SelectedValue = "ITEM_NAME" ←こんな感じのことをしたい     ELSE       設定しない     END IF   End If End Sub

  • GridViewのEditTemplate

    すみません。改めて質問させていただきます。 GridViewのEditTemplateにDropDownListが配置されています。 更新したときに、そのDropDownListの値を取得する方法をご教授頂きたいです。 言語はVBです。以下のコードを書きましたが取得できません(Updatingイベントのとき)↓ Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating MsgBox(GridView1.Rows(e.RowIndex).ToString) End Sub とりあえずメッセージボックスにドロップダウンリストの値を表示したいです。

  • 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 何卒よろしくお願いいたします。

  • GridViewで複数のDropDownListを連携表示しようとして

    GridViewで複数のDropDownListを連携表示しようとしています。 操作全般はソースコード(*.aspx.cs)から行い、動的な処理を行えるようにしたいのですが、 DropDownList同士のバインドのやり方が分からなくて、困っています。 具体的には、ListAのデータ一覧から、ListBのデータ一覧を表示するといった処理になります。 また、GridView上でのDropDownListの描画は、ライブラリにメソッドを組み込み、そこから呼び出しています。 ライブラリの宣言文は以下の通りです。 /// <summary> /// 子コントロールとテンプレートが属する Control オブジェクトを定義します。 /// </summary> /// <param name="container"></param> public void InstantiateIn(System.Web.UI.Control container) { System.Web.UI.WebControls.DropDownList wddlFrame = new System.Web.UI.WebControls.DropDownList(); wddlFrame.AutoPostBack = false; wddlFrame.CausesValidation = false; wddlFrame.ID = _IDname; wddlFrame.EnableViewState = true; wddlFrame.DataBinding += new EventHandler(wddlFrame_DataBinding); wddlFrame.Style.Add("width", this._listWidth.ToString() + "px"); container.Controls.Add(wddlFrame); } /// <summary> /// コントロールがデータソースに連結すると発生します。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void wddlFrame_DataBinding(object sender, EventArgs e) { System.Web.UI.WebControls.DropDownList wddlFrame = (System.Web.UI.WebControls.DropDownList)sender; GridViewRow container = (GridViewRow)wddlFrame.NamingContainer; if (this._listItems != null) { wddlFrame.Items.AddRange(this._listItems); } } ASPを弄るのは初めてで、また既存のデータをカスタマイズしているだけの為、 知らずに使っている部分も多くあり、完全に手詰まり状態となっています。 分かる方がおられましたらご教授お願いします。 上記ソースから察せられるかと思いますが、使用している言語はC#になります。

  • C#で動的に配置したコントロール

    はじめまして 開発歴1年未満の開発者ですがよろしくお願いします。 開発環境 Visual Studio 2008 C# ASP.NET protected void Page_Load(object sender, EventArgs e) { TextBox TextBox = new TextBox(); TextBox.ID = "TextBox1"; TextBox.Text = "C# ASP.NET"; form1.Controls.Add(TextBox); } protected void Button1_Click(object sender, EventArgs e) { string strTextBox1 = ??????? } と上記のように読み込み時に、テキストボックスのみを動的に配置し、デザイナで配置したのボタンを押した際に、テキストボックスに入力された値を、取得したいのですが、方法がわかりません・・・ お忙しいとは、思いますがご回答よろしくお願いします。

  • GridViewからの値を全件LOOPして取得したい

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 画面上に設置したボタン押下のイベントハンドラで、そのGridViewの全行をループして各列の値を参照したいのですが、 以下のようなに記述しても(1)の部分でNOTHINGとなりエラーになります。 どのようにすればよいでしょうか? やりたいことは、GridView全行ループし、ITEMKINDの値が"1"の時、TemplateField内にあるtxtNVERCHARの値を取得することです。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="ITEMKIND" HeaderText="ITEMKIND" Visible="False" /> </asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox CssClass="txtstr" ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub 更新_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExec.Click For Each row As GridViewRow In grdList.Rows Dim strITEMKIND As TextBox = DirectCast(row.FindControl("ITEMKIND"), TextBox)  ←(1) IF strITEMKIND.Text = "1" THEN Dim strDDL As TextBox = DirectCast(row.FindControl("txtNVERCHAR"), TextBox) End IF Next End Sub

  • 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;」は挿入しております。

  • C#について・・・

    次のようなブログラムなのですが、ラジオボタンが上手く切り替わりません。 どこを修正すると上手くいくでしょうか? <<文字数オーバーのため省略>> public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); if(isJapanStyle) { label5.Text=string.Format("0時0分0秒"); label6.Text=string.Format("0時0分0秒"); } else { label5.Text=string.Format("00:00:00"); label6.Text=string.Format("00:00:00"); } // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // <<文字数オーバーのため 省略>> static void Main() { Application.Run(new Form1()); } protected void button1_Click(object sender, System.EventArgs e) { if(isJapanStyle) { label5.Text=string.Format("{0}時{1}分{2}秒",dt.Hour,dt.Minute,dt.Second); } else { label5.Text=DateTime.Now.ToString("T"); } recTime=dt; timer2.Stop(); timer3.Start(); } private void button2_Click(object sender, System.EventArgs e) { Application.Exit(); } private void timer1_Tick(object sender, System.EventArgs e) { dt=DateTime.Now; if(isJapanStyle) { label4.Text=string.Format("{0}時{1}分{2}秒",dt.Hour,dt.Minute,dt.Second); } else { label4.Text=DateTime.Now.ToString("T"); } } private void timer3_Tick(object sender, System.EventArgs e) { keika=dt-recTime; if(isJapanStyle) { label6.Text=string.Format("{0}時間{1}分{2}秒",keika.Hours,keika.Minutes,keika.Seconds); } else { label6.Text=string.Format("{0}:{1}:{2}",keika.Hours,keika.Minutes,keika.Seconds); } } private void timer2_Tick(object sender, System.EventArgs e) { timer3.Stop(); } private void radioButton2_CheckedChanged(object sender, System.EventArgs e) { isJapanStyle=false; } private void radioButton1_CheckedChanged(object sender, System.EventArgs e) { isJapanStyle=true; } } }

  • VBの記述。サブや関数のコードを束ねる

    VBの記述でsubやfunctionの上の単位でまとめる記述があったように思えますが、久々で思い出せません。 クラスの構成だとかではなくコメントレベルの操作です。 □フォームの操作関係  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load   ' code  End Sub  Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed   ' code  End Sub □ボタンの操作関係  Private Sub Button_Close_Click(sender As Object, e As EventArgs) Handles Button_Close.Click   Me.Close()  End Sub  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click   ' code  End Sub サブの頭のところクリックしたら、コードが見えたり隠れたりするように、 記述ブロックの頭のところをクリックすると、記述ブロック全体のコードが見えたり隠れたりしたような。。。 なんというヤツでしたっけ?

専門家に質問してみよう