- PR -

GridView複数設置

投稿者投稿内容
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-30 23:29
ControlParameterは、PropertyNameに基づいて、ControlIDで指定されたコントロールの
どのプロパティの値を、データソースのパラメータに渡すかを決定します。
PropertyNameが省略された場合はそのコントロール(今回の場合のGridView)の既定のプロパティ、
正確にはControlValuePropertyAttributeで指定されたプロパティの値が使われます。
GridViewの場合、それはSelectedValueです。

このことは下記[解説]に書いてあります(コントロールと既定プロパティの対応表も[解説]の下にあります)
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.controlparameter.propertyname(VS.80).aspx

SelectedValueは、選択されている行の、キーフィールド(DataKeyNamesで指定されたフィールド)の
値を返します。複数のキーが指定されている場合、先頭のキーフィールド値のみを返します。
先頭以外のキーフィールドの値をとりたい場合、SelectedDataKeyを使用します。

上記のことは下記の[解説]に書いてあります。
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.selectedvalue(VS.80).aspx

私もさっき試して初めて知りましたが、
PropertyName="SelectedDataKey.Values[1]" とか
PropertyName='SelectedDataKey.Values["管理番号"]'
のように指定できるみたいです。
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2009-04-04 20:48
引用:

べるさんの書き込み (2009-03-30 23:29) より:
ControlParameterは、PropertyNameに基づいて、ControlIDで指定されたコントロールの
どのプロパティの値を、データソースのパラメータに渡すかを決定します。
PropertyNameが省略された場合はそのコントロール(今回の場合のGridView)の既定のプロパティ、
正確にはControlValuePropertyAttributeで指定されたプロパティの値が使われます。
GridViewの場合、それはSelectedValueです。

このことは下記[解説]に書いてあります(コントロールと既定プロパティの対応表も[解説]の下にあります)
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.controlparameter.propertyname(VS.80).aspx

SelectedValueは、選択されている行の、キーフィールド(DataKeyNamesで指定されたフィールド)の
値を返します。複数のキーが指定されている場合、先頭のキーフィールド値のみを返します。
先頭以外のキーフィールドの値をとりたい場合、SelectedDataKeyを使用します。

上記のことは下記の[解説]に書いてあります。
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.selectedvalue(VS.80).aspx

私もさっき試して初めて知りましたが、
PropertyName="SelectedDataKey.Values[1]" とか
PropertyName='SelectedDataKey.Values["管理番号"]'
のように指定できるみたいです。


試して実装できました?
色々SelectedDataKeyで検索してサンプル探して試したのですが・・
うまく表示してくれません。
view1のGridView1
DataKeyNamesを消してしまえばエラーがでます
view2のGridView2のSelectedDataKeyを正しく入力するとエラーは回避できるのですか?

だんだん分からなくなってきました
具体的にどの部分に記述すればよいのかが分かりません
現在はview2でGridView2内のSelectParametersで下記を入れています

<asp:ControlParameter ControlID="GridView2"
PropertyName='SelectedDataKey.Values["管理番号"]' Type="String" />

同様にFoamViewも変更させなければならないような・・・
できればまわりのソース表示お願いします。
初心者ですみませんm(__)m


[ メッセージ編集済み 編集者: BBSR 編集日時 2009-04-04 21:36 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-04-05 02:25
GridView1のDataKeyNamesは消しませんよ。FoamViewも変更する必要あるでしょうね。

下記のような感じでできています。
テーブルは違うしAccessじゃありませんが、プロパティ設定のしかたはわかると思います。

コード:
        <asp:GridView ID="GridView1" runat="server" DataKeyNames="id,no"

DataSourceID="SqlDataSource1"></asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1]">
</asp:SqlDataSource>

<asp:FormView ID="FormView1" runat="server" DataKeyNames="id"
DataSourceID="SqlDataSource3">
<ItemTemplate>省略</ItemTemplate>
</asp:FormView>

<asp:SqlDataSource ID="SqlDataSource3" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1] WHERE ([id] = @id)">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="id"
PropertyName='SelectedDataKey.Values["id"]' Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>

<asp:GridView ID="GridView2" runat="server" DataKeyNames="id"
DataSourceID="SqlDataSource2"></asp:GridView>

<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1] WHERE ([no] = @no)">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="no"
PropertyName='SelectedDataKey.Values["no"]' Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>



[追記]あ、これじゃGridView1の選択列が出ませんね。そこは追加してください。

[ メッセージ編集済み 編集者: べる 編集日時 2009-04-05 02:37 ]
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2009-04-06 19:11
引用:

べるさんの書き込み (2009-04-05 02:25) より:
GridView1のDataKeyNamesは消しませんよ。FoamViewも変更する必要あるでしょうね。

下記のような感じでできています。
テーブルは違うしAccessじゃありませんが、プロパティ設定のしかたはわかると思います。

コード:
        <asp:GridView ID="GridView1" runat="server" DataKeyNames="id,no"

DataSourceID="SqlDataSource1"></asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1]">
</asp:SqlDataSource>

<asp:FormView ID="FormView1" runat="server" DataKeyNames="id"
DataSourceID="SqlDataSource3">
<ItemTemplate>省略</ItemTemplate>
</asp:FormView>

<asp:SqlDataSource ID="SqlDataSource3" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1] WHERE ([id] = @id)">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="id"
PropertyName='SelectedDataKey.Values["id"]' Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>

<asp:GridView ID="GridView2" runat="server" DataKeyNames="id"
DataSourceID="SqlDataSource2"></asp:GridView>

<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="省略" ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [id], [no], [name] FROM [table1] WHERE ([no] = @no)">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="no"
PropertyName='SelectedDataKey.Values["no"]' Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>



[追記]あ、これじゃGridView1の選択列が出ませんね。そこは追加してください。

[ メッセージ編集済み 編集者: べる 編集日時 2009-04-05 02:37 ]



貴重なコードありがとうございます
SelectParameters内に下記を追加しました
Foam内
<asp:ControlParameter ControlID="GridView1" Name="ID"
PropertyName='SelectedDataKey.Values["ID"]'
ConvertEmptyStringToNull="False" Type="Int32" />
GridView2内
<asp:ControlParameter ControlID="GridView1" Name="管理番号"
PropertyName='SelectedDataKey.Values["管理番号"]' ConvertEmptyStringToNull="False" Type="String" />

実行すると下記のエラーが出ました。
DataBinding: 'System.Data.DataRowView'
には ID という名前のプロパティは含まれません。

おそらくFoam内のSelectParametersで指定したIDはGridView1には無いですよって
言ってる素人判断。


原因はGridView1にあるとしたら。。。
GridViewには少し改良してありテキストボックスで検索するようにしています。
それが下記になります(表示用に書き加え等ありますがきちんと動いてくれます)

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
PageSize="50" Width="967px" AllowSorting="True" CellPadding="1" ForeColor="Black" BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid" DataKeyNames="ID,管理番号">

<Columns>
<asp:CommandField ButtonType="Button" ShowSelectButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
<asp:BoundField DataField="管理番号" HeaderText="管理番号"
SortExpression="管理番号" />
----省略-----
<Columns>



<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="---省略---"
ProviderName="System.Data.OleDb" SelectCommand="SELECT ID,共通管理番号 FROM データーベース WHERE ((番号 LIKE '%' + @param1 + '%') OR (番号 IS NULL AND @param1 = ''))----省略-----">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" Name="?"PropertyName="Text" />
<asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="?"PropertyName="Text" />
<asp:ControlParameter ControlID="TextBox3" ConvertEmptyStringToNull="False" Name="?"PropertyName="Text" />
--省略-----
</SelectParameters>

基本的にGridView1のDataKeyNames="ID,管理番号を読みにいってるイメージでよいのですよね?
間違いは無いはずなんですが。。


[ メッセージ編集済み 編集者: BBSR 編集日時 2009-04-06 19:18 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-04-06 22:38
引用:
DataBinding: 'System.Data.DataRowView'
には ID という名前のプロパティは含まれません。

FormViewが参照しているDataSourceのSelectCommandでID列を取得していないにもかかわらず
FormViewにDataKeyNames="ID" があったり テンプレートで <%# Eval("ID") %> とかなってると
当然エラーになります。GridView2側も同様です。
BBSR
大ベテラン
会議室デビュー日: 2006/08/30
投稿数: 121
お住まい・勤務地: 大阪
投稿日時: 2009-04-07 14:59
引用:

べるさんの書き込み (2009-04-06 22:38) より:
引用:
DataBinding: 'System.Data.DataRowView'
には ID という名前のプロパティは含まれません。

FormViewが参照しているDataSourceのSelectCommandでID列を取得していないにもかかわらず
FormViewにDataKeyNames="ID" があったり テンプレートで <%# Eval("ID") %> とかなってると
当然エラーになります。GridView2側も同様です。


ありがとうございます
ご指摘道理DataKeyNames="ID"でした。
べる様のご指導等ありがとうございます
理想通りのページが出来上がりました。
しばらく完成のよいんにひたります
本当にありがとうございました。m(__)m

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