2012-03-01 13 views
0

ユーザーがASP.Net GridViewコントロールを使用して大量のデータを入力できるようにしようとしています。私が作成しようとしている影響は、GridViewコントロールをスプレッドシートのように動作させることです。ユーザーは自由にデータとタブを列から列に、行ごとに入力することができます。ユーザーは、ページの下部にあるボタンを使用して、必要に応じて行を追加できます。フォームの下部には、必要に応じて保存するためのボタンもあります。DataTableをASP.Net GridViewコントロールにバインドする際の問題

これを行うには、空の行がたくさんあるDataTableを作成し、GridViewにバインドしました。 GridViewの列は、テキストボックスを含むテンプレート列です。したがって、ページが開くと、実際にはスプレッドシートのように見えます。ユーザーが行追加ボタンを押すと、GridViewがバインドされているDataTableに10行追加するだけで、魅力的に機能します。

私が取り組んでいる問題は、ユーザーが入力したデータを読み込むことです。ユーザーがページングリンクまたは更新ボタンを押すと、ユーザーが入力したデータでDataTableを更新したいと思います。これは私が持っているものです。

Private Sub UpdateDataTable() 
    Dim objCatRow As clsCategoriesRow = Session("gvCategoriesRow") 
    Dim drQuery() As DataRow = Nothing 
    Dim drRow As DataRow = Nothing 
    Dim objRow As GridViewRow = Nothing 
    Dim intRecNo As Integer = 0 
    Dim txt As TextBox = Nothing 
    Dim lbl As Label = Nothing 

    'Loop through all of the rows in the grid view control 
    For Each objRow In Me.gvCategories.Rows 
     'Get the label that contains the identity column 
     lbl = objRow.Cells(GridColumns.Category).FindControl("lblItemRecNo") 
     intRecNo = lbl.Text 

     'Update the datarow bound to this grid view row 
     'First, query the datarow from the data table 
     drQuery = objCatRow.Table.Select("recno = " & intRecNo) 
     'Make sure our query returned a row 
     If Not IsNothing(drQuery) AndAlso drQuery.Count > 0 Then 

      'Get the value from the textbox in the grid view 
      txt = objRow.Cells(GridColumns.Category).FindControl("txtItemCategory") 
      'Upadte the data row with the value the user entered 
      'THE VALUE IN txt.Text IS EMPTY. HOW CAN I GET THE VALUE THE USER TYPED IN? 

      drQuery(0)("Category") = txt.Text 
      'Get the value from the textbox in the grid view 
      txt = objRow.Cells(GridColumns.SortORder).FindControl("txtItemSortOrder") 
      'Upadte the data row with the value the user entered 
      drQuery(0)("sortorder") = txt.Text 
     End If 
    Next 

End Sub 

問題は、これはユーザが入力した内容を返すされていないということである。ライン

TXT = objRow.Cells(GridColumns.Category).FindControl( "txtItemCategory")

返すAテンプレート化された列のテキストボックスへの参照。しかし、以前の値、つまりユーザーが入力した値ではなく、ビューステートの値が含まれます。

ユーザーがグリッドに入力した値を取得するにはどうすればよいですか?

各行にEDITボタンとUPDATEボタンを追加する方法を知りたいと思います。私はそうすることを避けたいと思います。私のユーザーは、膨大な数のデータを入力する必要があり、その方法ではアプリケーションを使用できなくなります。事前に

おかげで、

マイク

答えて

0

フォームデータをページに発見されました.Request.Form.Itemコレクション。 Page.Request.Form.AllKeysは、すべてのフォーム項目値に関連付けられた「キー」をリストします。

If Page.Request.Form.HasKeys Then 
For Each key as String In Page.Request.Form.AllKeys 
' step through the keys and use Page.Request.Form.Item(key) to get the data entered 
Next 
end If 

テストの後、私は限り、あなたはポストバックのコントロールをバインドしていないとして、ポストバックのpage.loadの間のRequest.FormデータやGridViewコントロールからデータを取得することができたが、唯一の時には、最初のリクエスト(「GET」)。

ページへのリクエストごとにコントロールを再作成する必要があります。コントロールがページに再作成され、コントロールのViewStateが処理された後にのみ、フォームデータコントロールを再作成するためにASP.NETで使用されている掲載リクエストデータなど

実際Request.Form collection ASP.NET Page Life Cycle

+0

上記のコードでは、Page.Request.Form.Item(key)またはPage.Request.Form(key)を使用してキーの値を取得します。 「キー」は文字列です。 – fenone

+0

これは私にとって素晴らしい仕事でした!ありがとう! – Mikutus

0

あなたはこれを交換する必要があります。

txt = objRow.Cells(GridColumns.Category).FindControl("txtItemCategory") 

をユーザーによって投稿この

txt = objRow.Cells(GridColumns.Category).FindControl("txtItemCategory").Value 
+0

、TXTテキストボックスではなく文字列です。したがって、行の最後に '.value'を追加すると、構文エラーが発生します( 'value'はSystem.Web.UI.Controlのメンバーではありません)。しかし、あなたの入力に感謝します。 – Mikutus

+0

.Valueの代わりに.Textを追加してください。 –

+0

objRow.Cells(GridColumns.Category).FindControl( "txtItemCategory")は、TemplateControl型の値を返します。テキストまたは値のいずれのプロパティも含まれません。私のコードでは、戻り値をTextBox型にキャストします。これはテキストプロパティを持ちます。しかし、それはページがサーバーによってレンダリングされた時の値を含みます。ユーザーが入力した値は含まれません。 – Mikutus

関連する問題