2010-11-09 35 views
2

我有以下的GridView和ObjectDataSource:如果Eval不爲空,如何在GridView中有選擇地顯示按鈕?

<asp:GridView 
    ID="grdTrades" 
    runat="server" 

    DataSourceID="srcTrades" 
    DataKeyNames="tradeId" 
    EnablePersistedSelection="true"    
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true" 
    PageSize = "10" 
    AutoGenerateColumns="false" 
    > 
    <Columns> 
     <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />       
     <asp:BoundField DataField="tradeId" HeaderText="TradeId" ReadOnly="True" SortExpression="tradeId" /> 
     <asp:BoundField DataField="symbol" HeaderText="Pair" SortExpression="symbol" /> 
     <asp:BoundField DataField="chartTimeFrame" HeaderText="TF" SortExpression="chartTimeFrame" /> 
     <asp:BoundField DataField="tradeSetupId" HeaderText="Setup" SortExpression="tradeSetupId" /> 
     <asp:BoundField DataField="tradeType" HeaderText="Trade Type" SortExpression="tradeType" /> 
     <asp:BoundField DataField="side" HeaderText="Side" ReadOnly="True" SortExpression="side" /> 
     <asp:BoundField DataField="units" HeaderText="Units" ReadOnly="True" SortExpression="units" /> 
     <asp:BoundField DataField="price" HeaderText="Price" SortExpression="price" /> 
     <asp:BoundField DataField="orderDateTime" HeaderText="Order Date/Time" SortExpression="orderDateTime" /> 
     <asp:BoundField DataField="pipsProfit" HeaderText="Pips profit" DataFormatString="{0:F1}" SortExpression="pipsProfit" /> 
     <asp:BoundField DataField="riskPips" HeaderText="Pips risked" DataFormatString="{0:F1}" SortExpression="riskPips" /> 
     <asp:BoundField DataField="pipsInMove" HeaderText="Pips in move" DataFormatString="{0:F1}" SortExpression="pipsInMove" /> 
     <asp:BoundField DataField="rewardRiskRatio" HeaderText="R/R" DataFormatString="{0:F1}" SortExpression="rewardRiskRatio" />    
     <asp:BoundField DataField="pctAccountRisked" HeaderText="% risk" DataFormatString="{0:F1}" ReadOnly="True" SortExpression="pctAccountRisked" /> 
     <asp:BoundField DataField="pctAccountChange" HeaderText="% AcctChange" DataFormatString="{0:F2}" SortExpression="pctAccountChange" />    
     <asp:TemplateField> 
      <ItemTemplate> 
       <input type="button" size="x-small" value="View" onclick="javascript:ShowImageInNewPage('DisplayImage.aspx?screenshotId=<%# Eval("screenshotId") %>');" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:HyperLinkField 
      Text="Edit" 
      DataNavigateUrlFields="tradeId" 
      DataNavigateUrlFormatString="EditTrade.aspx?screenshotId={0}" />     
     <CustomControls:DeleteButtonField ConfirmText="Delete this trade?" Text="Del" /> 
    </Columns> 
</asp:GridView> 

<CustomControls:CustomObjectDataSource 
    id="srcTrades" 
    TypeName="DatabaseComponent.DBUtil" 
    SelectMethod="GetTrades" 
    DeleteMethod="DeleteTrade"    
    runat="server"> 
    <DeleteParameters> 
     <asp:ControlParameter Name="tradeId" ControlId="grdTrades" PropertyName="SelectedValue" /> 
    </DeleteParameters> 
</CustomControls:CustomObjectDataSource> 

在我的TemplateField我只是想,如果screenshotId計算爲一個非空非零值,顯示該按鈕。如果screenshotId是DbNull或0,那麼我想讓單元格保持空白。我應該在ASP.NET代碼中編寫代碼,還是必須編寫一些代碼隱藏?最好的方法是什麼?

UPDATE

我已經添加以下代碼:

protected void grdTrades_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var dataitem = DataBinder.Eval(e.Row.DataItem, "screenshotId"); 
     Button btnShowImage = e.Row.FindControl("btnShowImage") as Button; 
     if (dataItem.screenshotId != null && screenshotId > 0) 
     { 
      btnShowImage.OnClientClick = "javascript:ShowImageInNewPage(\"DisplayImage.aspx?screenshotId=" + dataItem.screenshotId + "\");"; 
      btnShowImage.Visible = true; 
     } 
     else 
      btnShowImage.Visible = false;     
    } 
} 

但是我得到這些錯誤:

The name 'dataItem' does not exist in the current context

The name 'screenshotId' does not exist in the current context

MyRow也沒有被認可。有任何想法嗎?

更新2

我終於摸索出來 - 這裏是我的代碼:

protected void grdTrades_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // If you do it like this, you already get the screenshotId value; 
     var screenshotId = DataBinder.Eval(e.Row.DataItem, "screenshotId"); 
     Response.Write("ScreenshotId: " + screenshotId.ToString()); 

     Button btnShowImage = e.Row.FindControl("btnShowImage") as Button; 

     if (screenshotId is System.DBNull) 
      btnShowImage.Visible = false; 
     else    
     { 
      btnShowImage.Text = screenshotId.ToString(); 
      btnShowImage.OnClientClick = 
       "javascript:ShowImageInNewPage(\"DisplayImage.aspx?screenshotId=" + screenshotId.ToString() + "\");"; 
      btnShowImage.Visible = true; 
     }    
    } 
} 

回答

1

最好的辦法是處理OnRowDataBound事件。

<ItemTemplate> 
    <asp:Button runat="server" ID="btnShowImage" />     
</ItemTemplate> 

然後在後面的代碼:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // If you do it like this, you already get the screenshotId value; 
     var screenshotId = DataBinder.Eval(e.Row.DataItem, "screenshotId"); 

     Button btnShowImage = e.Row.FindControl("btnShowImage") as Button; 

     if(screenshotId != null && screenshotId > 0) 
     { 
      btnShowImage.OnClientClick = 
       "javascript:ShowImageInNewPage(\"DisplayImage.aspx?screenshotId=" + screenshotId.ToString() + "\");"; 
      btnShowImage.Visible = true; 
     } 
     else 
      btnShowImage.Visible = false; 
    } 
} 

類似的東西,但你必須根據自己的需要進行改進。不要忘記將事件處理程序添加到您的GridView標記中。

<asp:GridView OnRowDataBound="GridView1_RowDataBound".... /> 
+0

好東西Arief,什麼是MyRow? – 2010-11-09 10:48:40

+0

MyRow是一個表示來自DataSource的記錄(一行)的對象。這裏也可以使用DataBinder.Eval。 – Arief 2010-11-09 10:53:55

+0

@Arief - 我在我的問題中添加了更新部分。請看看,我無法讓MyRow工作,所以我嘗試按照你的建議使用DataBinder,但我仍然陷入困境。 – 2010-11-09 11:02:03

2

你能否全部聲明?

<asp:TemplateField> 
     <ItemTemplate> 
       <input runat="server" visible='<%# Eval("screenshotId") != DBNull.Value %>' type="button" size="x-small" value="View" onclick='<%# "ShowImageInNewPage(\"DisplayImage.aspx?screenshotId=" + Eval("screenshotId") + "\")" %>' /> 
     </ItemTemplate> 
    </asp:TemplateField> 
+0

不錯的解決方案,但是我得到了OnClick事件的錯誤:服務器標記格式不正確。如果我刪除了OnClick事件,則按鈕顯示正確,但是沒有附加事件。你能看到你提供的OnClick代碼有什麼問題嗎? – 2010-11-09 12:54:58

+0

我做了一個更正;現在嘗試一下。 – batwad 2010-11-09 16:27:53

+0

@batwad - 謝謝,但我仍然得到這個錯誤:''服務器標籤形成不良。'' – 2010-11-10 08:17:32

相關問題