|
■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="更新" />
<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="挿入" />
<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 の最後の方に記載されている方法を行う方がスマートそうに思えます。
|