DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SQLの所得結果によってGridViewのColumns設定内容を変更操作させる

環境/言語:[SQL Server2008  Microsoft Visual Web Developer 2008 Express Edition  ASP.NET]
分類:[ASP.NET]


皆さま

 いつも大変参考にさせて頂いております。
 また難題にぶつかってしまいアドバイスをお願いいたします。

VB側でSQLを実行し、実行結果をASP側のGridView内のColumnsに設定したい。
VB側のSQLの取得結果によってGridViewのColumns設定内容を変更した。
その際にIF分岐処理とDataBinder.Evalを使用しColumnsを操作したいのですが、
想定した動きにならず困っております。

※<% If DataBinder.Eval(Container.DataItem, "checkType") = "11" Then%>
 上記の方法でVB側で実施したSQLとBindした内容を取得する事ができない。
※Text='<%# DataBinder.Eval(Container.DataItem, "NG名称")
 TextにはVB側で実施SQL結果が正しく設定される。

VB側で実施したSQL取得結果によってASP側のGridViewのColumnsを操作する処理を
ASP側に記述するの考え方が一般的ではないのでしょうか。
いろいろ検索しているのですが、思うようにいきません。
ご教示、アドバイスをお願いいたします。

■ASPXファイル側の処理
<asp:GridView ID="GridView3" runat="server" AutoGenerateColumns="False"
BackColor="White" BorderColor="#336666" BorderStyle="Double" BorderWidth="3px"
CellPadding="4" DataSourceID="dsNgOrderResultD" GridLines="Horizontal" Width="800px">
<EmptyDataTemplate><h3>※受注NG情報がありません!</h3></EmptyDataTemplate>
<RowStyle BackColor="White" ForeColor="#333333" />
<Columns>
<asp:BoundField DataField="チェック日" HeaderText="チェック日" SortExpression="チェック日" />
<asp:BoundField DataField="明細番号" HeaderText="明細番号" ReadOnly="True"
SortExpression="明細番号" />
<asp:TemplateField HeaderText="NG名称" SortExpression="NG名称">
<ItemTemplate>
<% If DataBinder.Eval(Container.DataItem, "checkType") = "11" Then%>
<asp:Label ID="Label1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "NG名称") %>'></asp:Label>
<Br/>

<asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "blackListId") %>'></asp:Label>

<asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "checkTargetName") %>'></asp:Label>/
<asp:Label ID="Label3" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "blackListTypeName") %>'></asp:Label>】
<% Else%>
<asp:Label ID="Label1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "NG名称") %>'></asp:Label>
<% End If%>
</ItemTemplate>
</asp:TemplateField>

<asp:BoundField DataField="NG文言" HeaderText="NG文言" SortExpression="NG文言" />

<asp:BoundField DataField="結果" HeaderText="結果" ReadOnly="True"
SortExpression="結果" />
</Columns>
<FooterStyle BackColor="White" ForeColor="#333333" />
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />
</asp:GridView>
<!-- DB&GridView -->
<asp:SqlDataSource ID="dsNgOrderResultD" runat="server"
ConnectionString="<%$ ConnectionStrings:SQLDB %>" >
</asp:SqlDataSource>


■VB側の処理
''SQL実行
Try

arguments = New DataSourceSelectArguments()

sSql = ""
sSql = sSql & " select " & vbCrLf
sSql = sSql & " h.order_id , " & vbCrLf
sSql = sSql & " h.update_date as チェック日, " & vbCrLf
sSql = sSql & " IsNull( d.order_sub_id , 0 ) as 明細番号 , " & vbCrLf
sSql = sSql & " m.check_type_name as NG名称, " & vbCrLf
sSql = sSql & " m.check_mongon as NG文言, " & vbCrLf
sSql = sSql & " Case Coalesce( b.check_result , d.check_result , h.check_result ) When 0 Then 'OK' When 1 Then '承認' When 2 Then 'NG' Else 'エラー' End As 結果, " & vbCrLf
sSql = sSql & " h.check_type as checkType, " & vbCrLf
sSql = sSql & " IsNull(b.black_list_id,'') as blackListId, " & vbCrLf
sSql = sSql & " Case b.check_target When 1 Then '注文者' When 2 Then '配送先' Else '' End as checkTargetName , " & vbCrLf
sSql = sSql & " bm.black_list_type_name as blackListTypeName, " & vbCrLf
sSql = sSql & " bl.black_list_value as blackListValue, " & vbCrLf
sSql = sSql & " bl.black_list_comment as blackListComment" & vbCrLf
sSql = sSql & " " & vbCrLf
sSql = sSql & " from " & vbCrLf
・・省・・
・・略・・

Me.dsNgOrderResultD.SelectCommand = sSql
dtView = CType(Me.dsNgOrderResultD.Select(arguments), DataView)

If dtView.Count = 0 Then
''エラー表示
LabelErrMsg.Text = "NG情報がなし。<br />"
Exit Function
End If


以上です。ご教示のほど、宜しくお願い致します。
<% 〜>と<%# 〜>では動作が違うので実現は難しいと思います

IIFを使われてはいかがでしょうか?
Text='<%# IIF(Eval(Container.DataItem, "checkType") = "11","OK","NG") %>'

IIFで実現できない場合はProtectedで定義した関数を<%# >内で呼び出す等で対応できます
よく内容見るとLabelの表示非表示を制御してるだけっぽいので
Visble='<%# Eval(Container.DataItem, "checkType") = "11" %>'
だけでもいいかもしれないです
■No28463に返信(Miraさんの記事)
> よく内容見るとLabelの表示非表示を制御してるだけっぽいので
> Visble='<%# Eval(Container.DataItem, "checkType") = "11" %>'
> だけでもいいかもしれないです

Mira さん

 アドバイス有難うございます。
 Visbleを操作する方向で解決できました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板