- PR -

datagrid での更新処理で教えてください(ASP.NET)

投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-02-02 19:14
すみません 過去ログを探してみたのですが
初歩的すぎるようです すみませんがご教授の程お願いします。

VS.NETを使用しております。
テンプレート編集にて、EditItemTamplate にてTEXTBOX を設定しました
この値の取得方法が、解りません。 すみません 初歩すぎて
呆れられると思いますが、教えてください m(__)m

とりあえず、本のサンプルからパクってきて、下記のようにソースを作成しましたが
キャストエラーになります  VB.NETです


Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommand
DataGrid1.EditItemIndex = e.Item.ItemIndex
DataGrid1.DataBind()
End Sub



Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand
Dim txtsuitobi As TextBox = e.Item.Cells(6).Controls(0) ← ここでエラー
Dim txtsuitocd As TextBox = e.Item.Cells(7).Controls(0)

SqlDataAdapter1.UpdateCommand.Parameters.Add("@出納日", txtsuitobi)
SqlDataAdapter1.UpdateCommand.Parameters.Add("@出納部門コード", txtsuitocd)
SqlDataAdapter1.UpdateCommand.ExecuteNonQuery()
DataGrid1.EditItemIndex = -1
DataGrid1.DataBind()

End Sub

------------------------------------------------------
Dim txtsuitobi As TextBox = e.Item.Cells(6).Controls(0)  行で
「指定されたキャストは有効ではありません。」 と言われます

データウォッチで e.Item.Cells(6).text="" です
         e.Item.Cells(6).Controls(0) の見方がよく解らないので不明・・・・

DataGrid1_EditCommand イベント後の、実現は
編集ボタンを押した行に、更新・キャンセル ボタンが表示され
各セルも、テンプレート編集にて、EDITITEMTENPLATE にて設定したTEXTBOXが表示され
TEXTBOX内のデータも初期表示には、DBの内容が表示されます。

無月 重造
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 67
投稿日時: 2004-02-03 10:37
Dim txtsuitobi As TextBox = e.Item.Cells(6).Controls(0)
Dim txtsuitocd As TextBox = e.Item.Cells(7).Controls(0)



Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(0),TextBox)
Dim txtsuitocd As TextBox = CType(e.Item.Cells(7).Controls(0),TextBox)

で解決できませんか?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-02-03 10:55
引用:

無月 重造さんの書き込み (2004-02-03 10:37) より:
Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(0),TextBox)
Dim txtsuitocd As TextBox = CType(e.Item.Cells(7).Controls(0),TextBox)

で解決できませんか?



レスをありがとうございます。
Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(0),TextBox)
これも試したのですが、
「キャストは無効です」と言われます


ぴお
会議室デビュー日: 2004/01/16
投稿数: 10
投稿日時: 2004-02-03 11:00
引用:
--------------------------------------------------------------------------------


無月 重造さんの書き込み (2004-02-03 10:37) より:
Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(0),TextBox)
Dim txtsuitocd As TextBox = CType(e.Item.Cells(7).Controls(0),TextBox)

で解決できませんか?

--------------------------------------------------------------------------------
Dim txtsuitocd As String = CType(e.Item.Cells(7).Controls(0),TextBox).Text
Dim txtsuitocd As string = CType(e.Item.Cells(7).Controls(0),TextBox).Text

でテキストボックスの入力内容を取得できます。

これで、解決できませんか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-03 11:08
引用:

七さんの書き込み (2004-02-02 19:14) より:

データウォッチで e.Item.Cells(6).text="" です
         e.Item.Cells(6).Controls(0) の見方がよく解らないので不明・・・・


 クイックウォッチに「e.Item.Cells(6).Controls」だけ打ち込むと、ControlCollectionに入っている個数が、Countプロパティに出てくると思います。それがいくつになっていますか?
 クイックウォッチに「e.Item.Cells(6).Controls(n)」と入れると、データタイプが最上行付近にあると思います。または、「e.Item.Cells(6).Controls(n).GetType().ToString()」と入れてください。それでクラスがわかります。
※nは、0からCountプロパティ-1まで

 おそらく、複数のコントロールがあって、0番目がTextBoxではない、ということだと思います。目的のコントロールを探す、という手順をコーディングすればいいのですが、ちょっと手間ですね。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-02-03 11:26
直接の回答ではありませんが、
ページトレースを有効にすれば、何かが見えるかもしれません。
「e.Item.Cells(6).Controls(0)」が何を参照しているかを考えてみてください。

参考:.NET Framework 開発者ガイド > ページのトレースの有効化
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-02-03 12:02
無月さん、びおさん、Jittaさん ありがとうございました m(__)m

引用:

Jittaさんの書き込み (2004-02-03 11:08) より:
 クイックウォッチに「e.Item.Cells(6).Controls」だけ打ち込むと、ControlCollectionに入っている個数が、Countプロパティに出てくると思います。それがいくつになっていますか?
 クイックウォッチに「e.Item.Cells(6).Controls(n)」と入れると、データタイプが最上行付近にあると思います。または、「e.Item.Cells(6).Controls(n).GetType().ToString()」と入れてください。それでクラスがわかります。
※nは、0からCountプロパティ-1まで

 おそらく、複数のコントロールがあって、0番目がTextBoxではない、ということだと思います。目的のコントロールを探す、という手順をコーディングすればいいのですが、ちょっと手間ですね。



control.count=3でした
control(1) にtextboxがありました ありがとうございました。

Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(1), TextBox)
として、うまくいきました ありがとうございます m(__)m

ちなみに、
control(0),control(2)の「GetType().ToString()」を表示すると
control(0),control(2)共に、System.Web.UILiteralControl とありますが
control(0)はItemTemplateのLABELを指していると思っていいのでしょうか?
control(2)はFOOTER???

デザイナが作成したHTMLが、下記のようになっています。

 <asp:datagrid id=DataGrid1 style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 72px" runat="server" ShowFooter="True" DataSource="<%# 入金H1 %>" DataKeyField="出納日" AllowSorting="True" DataMember="入金伝票_H" AllowPaging="True" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="3" AutoGenerateColumns="False">
    |
    略
|
<Columns>
<asp:TemplateColumn HeaderText="出納日">
<ItemTemplate>
<asp:Label id=Label3 runat="server" Text='<%# EvalContainer, "DataItem.出納日") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id=suitobi runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.出納日") %>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
|

|
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" Mode="NumericPages"></PagerStyle>
</asp:datagrid></FONT></form>


   まだまだ、解らない事が多すぎて、ままなりません
   今後とも、よろしくお願い致します
   
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-03 12:11
引用:

七さんの書き込み (2004-02-03 12:02) より:

control.count=3でした
control(1) にtextboxがありました ありがとうございました。

Dim txtsuitobi As TextBox = CType(e.Item.Cells(6).Controls(1), TextBox)
として、うまくいきました ありがとうございます m(__)m




多分、Indexを決めうちにしてしまうよりも・・・
コード:

Public Shared Function GetControl(ByVal Parent As Control, _
ByVal Type As System.Type, _
Optional ByVal Name As String = "") As Control
Dim objControl As Control

If Name.Length() > 0 Then
Return Parent.FindControl(Name)
End If

For Each objControl In Parent.Controls
If objControl.GetType().FullName = Type.FullName Then
Return objControl
End If
If objControl.Controls.Count > 0 Then
Dim tmpControl As Control
tmpControl = GetControl(objControl, Type, Name)
If Not tmpControl Is Nothing Then
Return tmpControl
End If
End If
Next
Return Nothing
End Function



のように、Functionを実装しておいたほうが安全かもしれません。

#修正:引数の部分を開業もとい改行

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-03 18:32 ]

スキルアップ/キャリアアップ(JOB@IT)