- PR -

GridView TemplateFieldを使った時のUpdate

1
投稿者投稿内容
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-21 16:22
お世話になります。VB.NET初心者です。どなたか,どうか教えて下さい。
(初回投稿資料が見づらいものだったので,改めさせて頂きました。)
GridViewのTemplateField内にボタンやテキストボックスを配置してDBと連携して
データを更新するWeb画面を作っています。編集ボタン押下後,テキストボックス
の値を書き換え,更新ボタンを押下するとDB更新とGridViewの表示内容が変わる
という初歩的な処理を作っていますが,更新ボタンを押下しても書き換えた内容
がDBおよび画面に反映されません。当@ITの連載記事を元にやったのですが出来ま
せんでした。記事を参考にしたのは,VBコードの「GridView1_RowUpdating」部分
です。TemplateFieldを使っているのは,新規追加行を作りたかったため,そうし
ています。

開発環境:MS-VisualWebDeveloper2008ExpressEdition
言語:VB
DB:MS-SQLServer2005ExpressEdition

HTMLソース:以下のとおりです。

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="MstBusinessPhase.aspx.vb" Inherits="MstBusinessPhase" %>
      ・
      ・
      ・
 【SQLデータソース】
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:strConString %>"
ProviderName="<%$ ConnectionStrings:strConString.ProviderName %>"
ConflictDetection="OverwriteChanges"
OldValuesParameterFormatString="original_{0}"

SelectCommand="SELECT [A], [B], [C] FROM [table1] WHERE (([A] LIKE '%' + @A + '%') AND ([B] LIKE '%' + @B + '%') AND ([C] LIKE '%' + @C + '%'))"
DeleteCommand="DELETE FROM [table1] WHERE [A] = @original_A"
InsertCommand="INSERT INTO [table1] ([A], [B], [C]) VALUES (@A, @B, @C)"
UpdateCommand="UPDATE [table1] SET [B] = @B, [C] = @C WHERE [A] = @original_A">

<SelectParameters>
<asp:ControlParameter ControlID="txtA" DefaultValue="%" Name="A" PropertyName="Text" Type="String" />
<asp:ControlParameter ControlID="txtB" DefaultValue="%" Name="B" PropertyName="Text" Type="String" />
<asp:ControlParameter ControlID="txtC" DefaultValue="%" Name="C" PropertyName="Text" Type="String" />
</SelectParameters>

<DeleteParameters>
<asp:Parameter Name="original_A" Type="String" />
<asp:Parameter Name="original_B" Type="String" />
<asp:Parameter Name="original_C" Type="String" />
</DeleteParameters>

<UpdateParameters>
<asp:Parameter Name="original_A" Type="string" />
<asp:Parameter Name="B" Type="String" />
<asp:Parameter Name="C" Type="String" />
</UpdateParameters>

<InsertParameters>
<asp:Parameter Name="A" Type="String" />
<asp:Parameter Name="B" Type="String" />
<asp:Parameter Name="C" Type="String" />
</InsertParameters>
</asp:SqlDataSource>

 【GridView】
<asp:GridView ID="GridView1" runat="server"・・・

<Columns>

<asp:TemplateField ShowHeader="False">

<ItemTemplate>
・・・ 編集ボタン/削除ボタンを配置 ・・・
</ItemTemplate>

<EditItemTemplate>
・・・ 更新ボタン/中止ボタンを配置 ・・・
</EditItemTemplate>

<FooterTemplate>
  ・・・ 追加ボタンを配置 ・・・
</FooterTemplate>

</asp:TemplateField>

 【データA列】
<asp:TemplateField HeaderText="データA">

<ItemTemplate>
<asp:Label ID="lblA" runat="server" Text='<%# Eval("A") %>'></asp:Label>
</ItemTemplate>

<EditItemTemplate>
<asp:Label ID="lblA" runat="server" Text='<%# Eval("A") %>'></asp:Label>
</EditItemTemplate>

<FooterTemplate>
<asp:TextBox ID="txtA_Insert" runat="server"></asp:TextBox>
</FooterTemplate>

</asp:TemplateField>

 【データB列】
<asp:TemplateField HeaderText="データB">

<ItemTemplate>
<asp:Label ID="lblB" runat="server" Text='<%# Eval("B") %>'></asp:Label>
</ItemTemplate>

<EditItemTemplate>
<asp:TextBox ID="txtB" runat="server" Text='<%# Bind("B") %>'></asp:TextBox>
</EditItemTemplate>

<FooterTemplate>
<asp:TextBox ID="txtB_Insert" runat="server"></asp:TextBox>
</FooterTemplate>

</asp:TemplateField>

 【データC列】
<asp:TemplateField HeaderText="データC">

<ItemTemplate>
<asp:Label ID="lblC" runat="server" Text='<%# Eval("C") %>'></asp:Label>
</ItemTemplate>

<EditItemTemplate>
<asp:Label ID="lblC" runat="server" Text='<%# Eval("C") %>'></asp:Label>
</EditItemTemplate>

<FooterTemplate>
<asp:Label ID="lblC_Insert" runat="server"></asp:Label>
</FooterTemplate>

</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
・・・ データ0件用に定義 ・・・
</EmptyDataTemplate>
</asp:GridView>

VBコード:以下のとおりです。

Imports System.Data
Imports System.Data.SqlClient
Partial Class MaterPage
Inherits System.Web.UI.Page





 【行の更新処理】
  Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
'データA列をKeyとして更新
    'データB列は,画面入力値よりDB更新
    'データC列は,B列を更新した日付をプログラムでセット

Dim KoushinDate As String = Format(Now(), "yyyyMMddHHmmss")

Dim row As GridViewRow = GridView1.Rows(e.RowIndex)
Dim txtBox As TextBox = DirectCast(row.FindControl("txtB"), TextBox)

e.NewValues("B") = txtBox.Text
e.NewValues("C") = KoushinDate

End Sub

評価式(Eval,Bind)の部分で足りないところがあるのでしょうか?
評価式に値を入れてやることにより,更新後のGrid表示内容とDB内容が
変わるのではないのでしょうか?
初心者で言葉足らずの部分もあるかと思いますが,宜しくお願い致します。

[ メッセージ編集済み 編集者: ちゃい 編集日時 2009-01-26 13:26 ]
ちゃい
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-30 17:39
お騒がせして申し訳ありませんでした。ちゃい本人です。
初歩的なモレがあったため,できない状態でした。
次のKEYをGridViewに追記することにより解決しました。

<asp:GridView ID="GridView1" runat="server"・・(略)・・DataKeyNames="A">

どうもすみませんでした。
今後とも宜しくお願い致します。

以 上
1

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