2011-08-12 15 views
3

オブジェクトリストとデータリストコントロール間のデータバインドを使用しようとしています。私は何をしたいオブジェクト ASP.NETでの双方向データバインディング

  • のリストを

    1. を作成している彼らがコントロールにバインドされているUI
    2. 変更データは、オブジェクトのリストにバインドされたUIの変化を持っている
    3. 背面ポストに
    4. - UI

    からの新しい値を持つオブジェクトのリストを持っています
    Option Explicit On 
    Option Strict On 
    
    Imports System.Diagnostics 
    
    Partial Class _Default 
        Inherits System.Web.UI.Page 
    
    Dim Class1List As List(Of Class1) 
    
    Protected Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreLoad 
        Dim txtValue1 As TextBox 
        Dim txtValue2 As TextBox 
        Dim txtValue3 As TextBox 
        Dim ItemIndex As Integer = 0 
    
        If Page.IsPostBack Then 
         Class1List = CType(Session("Class1List"), List(Of Global.Class1)) 
         'Class1List = CType(DataList1.DataSource, List(Of Global.Class1)) 
         For Each myDataListItem As DataListItem In DataList1.Items 
          txtValue1 = CType(myDataListItem.FindControl("txtValue1"), TextBox) 
          Long.TryParse(txtValue1.Text, Class1List(ItemIndex).Value1) 
    
          txtValue2 = CType(myDataListItem.FindControl("txtValue2"), TextBox) 
          Integer.TryParse(txtValue2.Text, Class1List(ItemIndex).Value2) 
    
          txtValue3 = CType(myDataListItem.FindControl("txtValue3"), TextBox) 
          Class1List(ItemIndex).Value3 = txtValue3.Text 
    
          ItemIndex += 1 
         Next 
        End If 
    End Sub 
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
        Dim myClass1 As Class1 
    
        If Not Page.IsPostBack Then 
         Class1List = New List(Of Class1) 
         myClass1 = New Class1 
         Class1List.Add(myClass1) 
         BindData() 
        Else 
         'Class1List = CType(DataList1.DataSource, List(Of Global.Class1)) 
         Debug.WriteLine("Page_Load, Value1 = " & Class1List(0).Value1.ToString()) 
         Debug.WriteLine("Page_Load, Value2 = " & Class1List(0).Value2.ToString()) 
         Debug.WriteLine("Page_Load, Value3 = " & Class1List(0).Value3) 
        End If 
    End Sub 
    
    Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload 
        Session("Class1List") = Class1List 
    End Sub 
    
    Sub BindData() 
        DataList1.DataSource = Class1List 
        DataList1.DataBind() 
    End Sub 
    
    Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound 
        Dim myClass1 As Class1 
    
        If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then 
         myClass1 = CType(e.Item.DataItem, Class1) 
         Debug.WriteLine("DataList1_ItemDataBound, Value1 = " & myClass1.Value1.ToString()) 
         Debug.WriteLine("DataList1_ItemDataBound, Value2 = " & myClass1.Value2.ToString()) 
         Debug.WriteLine("DataList1_ItemDataBound, Value3 = " & myClass1.Value3) 
    
        End If 
    End Sub 
    
    Protected Sub btnDoPostBack_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDoPostBack.Click 
        Dim myRandom As New Random 
    
        Class1List(0).Value1 = myRandom.Next(100) 
        Class1List(0).Value2 = myRandom.Next(100) 
        Class1List(0).Value3 = myRandom.Next(100).ToString() 
        Debug.WriteLine("btnDoPostBack_Click, Value1 = " & Class1List(0).Value1.ToString()) 
        Debug.WriteLine("btnDoPostBack_Click, Value2 = " & Class1List(0).Value2.ToString()) 
        Debug.WriteLine("btnDoPostBack_Click, Value3 = " & Class1List(0).Value3) 
        BindData() 
    End Sub 
    End Class 
    

    クラスClass1は簡単です:

    Option Explicit On 
    Option Strict On 
    
    Imports Microsoft.VisualBasic 
    
    Public Class Class1 
    Private _ClassID As Long 
    Private _Value1 As Long 
    Private _Value2 As Integer 
    Private _value3 As String = String.Empty 
    
    Public Property ClassID As Long 
        Get 
         Return _ClassID 
        End Get 
        Set(ByVal value As Long) 
         _ClassID = value 
        End Set 
    End Property 
    
    Public Property Value1 As Long 
        Get 
         Return _Value1 
        End Get 
        Set(ByVal value As Long) 
         _Value1 = value 
        End Set 
    End Property 
    
    Public Property Value2 As Integer 
        Get 
         Return _Value2 
        End Get 
        Set(ByVal value As Integer) 
         _Value2 = value 
        End Set 
    End Property 
    
    Public Property Value3 As String 
        Get 
         Return _value3 
        End Get 
        Set(ByVal value As String) 
         _value3 = value 
        End Set 
    End Property 
    End Class 
    

    アップデート:私は、私はそれが何をやりたいの背後に上記のコードを持って - 私はそこに考えていましたより良い方法でしたか?

  • 答えて

    3

    あなたはデータバインディングの「ロード」フェーズ(にコントロールリストからデータをバインドするコード)を示さなかった - 私はあなたがに不満がある部分は、「保存」フェーズであると仮定(バックにリストからコントロール変更された値をバインドPage_PreLoadのコード)、リスト内すなわち#4:

    は、オブジェクト

    のリストにバインドされたUIの変化を持っています

    「双方向データバインディング」が必要なように聞こえます。.NETにの更新モデルを簡単にモデル化するとはモデルからと読み取られます。これはcommon complaintです。 1つの解決策はsubclass WebControlですが、それは混乱です。

    あなたはすでに<%# Bind("...") %>の構文を使用していますので、あなたは正しい考えを持っています。そのアプローチは、<asp:SqlDataSource>とすぐに動作するはずですが、カスタムクラスを更新したいので、代わりに<asp:ObjectDataSource>を使用する必要があります。 SqlDataSourceの代わりにObjectDataSourceを使用する場合を除いて、this articleの方法を使用します。

    しかし、最初にあなたは[System.ComponentModel.DataObject]とそれをマークし、このような適切な更新方法を指定してのObjectDataSourceと(すなわち、Class1)互換性のあるモデルを作る必要があります:

    [System.ComponentModel.DataObjectMethodAttribute(
        System.ComponentModel.DataObjectMethodType.Update, true)] 
    public bool UpdateProduct(string productName, ...) { 
        ... 
    } 
    

    これは、あなたが上ObjectDataSourceを使用できるようになりますあなたのウェブフォームと最終的に素敵な2ウェイデータバインディングを取得します。詳細はリンクを参照してください。

    Visual Studioでは、TableAdaptersや悪名高いStrongly-Typed DataSet (STD)など、さまざまな方法でこれを自動化することができますが、独自のオブジェクトモデルを持っているような人は役に立ちません。とにかく私はSTDをお勧めしません。

    もっと良い方法があると思っていましたか?

    あなたの現在のアプローチが悪いとは思わない。あなたのウェブフォームにたくさんのロジックがあることを心配している場合は、MVCアプローチを使用すると、砂糖の結合を心配するよりもはるかに多くの利益を得るでしょう...

    +0

    健全性チェックありがとうございます。何が問題なのですか?私はGridViewを使用していました。顧客は各行を選択し、1つの行の更新を押した後、各行を更新する必要がありました。すべてのグリッドをExcelのように開くようにします。また、データは本質的に階層的であるため、リスト内のリストにリストされます。だから、私は希望の結果を得ることができるかどうかを確認するためにネストされたDataListコントロールで遊んでいます。 – Bubba

    関連する問題