- PR -

DataGridにあるHyperLinkの内容を取得して、DBから削除したい

投稿者投稿内容
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-02-16 15:45
ASP.NETで開発中の@beginnerです。よろしくお願いします。
現在、DataGridに配置した削除ボタンより同行にある
HyperLinkの内容を取得した後に、
それに紐づくデータをDBから削除しようと試みています。
DataRowViewやDataGridItem,TableCell,e.Item.Cell(i)等々
試したのですがうまくいきません。
以下にサンプルを記しますのでご教授いただけないでしょうか。
よろしくお願いします。

・Windows XP
・Visual Studio .NET 2003
・.NET Framework v1.1

**********ここからItemDataBound**********
Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound

If Not e.Item.DataItem Is Nothing Then

Dim datarowview As DataRowView = CType(e.Item.DataItem, DataRowView)

'以下の "person" は <asp:HyperLink id="person" runat="server"> のidです。
Dim hyperlink As HyperLink = CType(e.Item.FindControl("person"), HyperLink)

'以下の "ANIMAL" は <asp:TemplateColumn HeaderText="ANIMAL"> のHeaderTextです。
hyperlink.Text = row("ANIMAL")

If row("ID") = 0 Then
hyperlink.NavigateUrl = "./previous.aspx?id=" & row("ID") & " & name=" & row("NAME")
Else
hyperlink.NavigateUrl = "./next.aspx?id=" & row("ID") & "& name=" & row("NAME")
End If
End If
End Sub
**********ここまで**********

**********ここからDeleteCommand**********
Private Sub DataGrid1_DeleteCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.DeleteCommand

'この部分にDataGridの削除ボタンがクリックされた行のIDを取得して、
'IDに紐づくデータをDBから削除するコードを書きたい。

'DBから削除された後に次ページへ遷移
Response.Redirect("./check.aspx")

End Sub
**********ここまで**********
THREE-ONE
常連さん
会議室デビュー日: 2006/08/17
投稿数: 36
投稿日時: 2007-02-16 22:37
ID を Delete を実行するボタンの CommandArgument に渡しておいたらどうですか?
そうすれば DeleteCommand 時に、DataGridCommandEventArgs::CommandArgument から ID が取得できると思います。
ID が取れたらいいんですよね?
HyperLink から取得しなければならないなんてことは別にないですよね?

[ メッセージ編集済み 編集者: THREE-ONE 編集日時 2007-02-16 22:38 ]
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-02-19 08:48
ご返事が遅くなりました。
レスありがとうございます。
早速、CommandArgumentで試してみます。

>ID が取れたらいいんですよね?
はい。IDが取得できればと。
ただ、HyperLinkに紐づくIDでなければならないので、
その辺をどのようにすればよいのかまだ理解できていません。
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-02-19 10:50
CommandArgumentを使おうと試みたのですが、
DeleteボタンをDataGrid内に配置しているため、
ButtonColumnクラスにはCommandArgumentについて
言及されておらず、
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpref/html/frlrfSystemWebUIWebControlsButtonColumnClassTopic.htm
実際に.aspxにCommandArgumentを記述すると
「要素'ButtonColumn'属性の'CommandArgument'みつかりませんでした。」
となってしまいます。

ButtonクラスではCommandArgumentがあるのですが・・・
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpref/html/frlrfsystemwebuiwebcontrolsbuttonclasstopic.htm

私の調べ方が未熟で、不十分なのかもしれないですが、
皆様再度ヒントをいただけないでしょうか。
よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-02-19 16:56
ちょっとv1.1で試せないんですが、テンプレート列にすることで対応できませんか?
ボタンのCommandNameを"Delete"にすれば削除ボタンとして機能したと思います。
しょくぱん
常連さん
会議室デビュー日: 2006/05/31
投稿数: 31
投稿日時: 2007-02-19 17:39
私はDataGridを使用する際、いつも先頭の列を非表示のBoundColumnにしてIDをバインドすることにしています。
んで、行が選択されたときはItemCommandイベントなどにおいて
e.Item.Cells[0].TextでバインドしたデータのIDを取得してますよ。
THREE-ONE
常連さん
会議室デビュー日: 2006/08/17
投稿数: 36
投稿日時: 2007-02-19 22:49
それでは、DataKeyField プロパティにデータソースの ID 列を指定してみてはいかがですか?
DataGrid::DataKeys[e.Item.ItemIndex] で取得できるはずです。

[ メッセージ編集済み 編集者: THREE-ONE 編集日時 2007-02-19 22:50 ]
@beginner
会議室デビュー日: 2007/02/16
投稿数: 9
投稿日時: 2007-02-20 09:55
ご返事が遅くなりましたが、
皆様レスありがとうございます。

>べる様
ありがとうございます。
以下のようにTemplateColumnにすることができました。
ただ、ButtonColumnとの違いがあまり理解できていません。
<asp:TemplateColumn HeaderText="DELETE">
<ItemTemplate>
<asp:Button id="delbottun" runat="server" Text="削除" CommandName="Delete" >
</asp:Button>
</ItemTemplate>
</asp:TemplateColumn>

>しょくぱん様
ありがとうございます。
なるほど。非表示のBoundColumn試してみますね。

>THREE-ONE様
レスありがとうございます。
DataKeyFieldプロパティ!
初めて知り、早速ヘルプで調べてみました。
Dim row As DataRow = dt.Rows.Find(ItemsGrid.DataKeys(e.Item.ItemIndex))
でできそうな気がしてきました。

時間はかかりますが、
皆様のヒントをもとに頑張ってみて
報告させていただきます。
VBで作っており、C#からのコードの変換?も
まだまだですが、ありがとうございます。
またご指導いただくかもしれませんが
よろしくお願いします。

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