2013-02-15 48 views
2

我有一個網格視圖,其中一些行已附加圖片。當我按下Button2時,我從sql記錄中獲取信息,瞭解服務器上哪個文件夾中有圖片。 這工作已經,但我不能讓按鈕僅在有圖像文件夾連接的行中可見。當字段爲空時,在gridview中隱藏按鈕

我搜索了很長時間,發現了類似於以下的不同解決方案,但是我無法使其工作。 我在做什麼錯?

<asp:SqlDataSource ID="SqlDSodinRSSfeb" runat="server" 
    ConnectionString="<%$ ConnectionStrings:herning_brand_dk_dbConnectionString %>"     
    SelectCommand="SELECT PubDateTime, Melding, Station, PhotoFolder FROM OdinRSS "> 
</asp:SqlDataSource>  
<asp:GridView ID="GridView14" runat="server" DataSourceID="SqlDSodinRSSfeb" 
    AutoGenerateColumns="False" Width="500px" OnRowCommand="Button_RowCommand" > 
    <Columns> 
     <asp:BoundField DataField="PubDateTime" HeaderText="Tidspunkt" /> 
     <asp:BoundField DataField="Melding" HeaderText="Melding for udkaldet" /> 
     <asp:BoundField DataField="Station" HeaderText="Station" /> 
     <asp:TemplateField HeaderText="Foto" > 
      <EditItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PhotoFolder") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:Button ID="Button2" runat="server" Text="Foto" Visible='<%# Eval("PhotoFolder") != "Null" %>' 
          CommandName="ButtonClick" CommandArgument='<%# Eval("PhotoFolder") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

我的.cs

protected void Button_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandArgument != null) 
    { 
     switch (e.CommandName) 
     { 
      case "ButtonClick": 
       { 
        int Folder = Convert.ToInt32(e.CommandArgument); 
        PhotoList(Folder); 
       } 
       break; 
     } 
    } 
} 

void PhotoList(int FolderNumber) 
{ 
    var imagePaths = Directory.GetFiles(Server.MapPath("PhotoFolder\\" + FolderNumber)); 
    var imageNames = new string[imagePaths.Length]; 

    for (int i = 0; i < imagePaths.Length; i++) 
    { 
     imageNames[i] = imagePaths[i].Substring(imagePaths[i].LastIndexOf("\\") + 1); 
    } 

    var dt = new DataTable(); 
    dt.Columns.Add("ImageName", typeof(string)); 
    dt.Columns.Add("ImagePath", typeof(string)); 

    foreach (var imgName in imageNames) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["ImageName"] = RemoveExtension(imgName); 
     dr["ImagePath"] = "PhotoFolder/" + FolderNumber + "/" + imgName; 
     dt.Rows.Add(dr); 
    } 
    DataList1.DataSource = dt; 
    DataList1.DataBind(); 
} 

string RemoveExtension(string imgName) 
{ 
    return imgName 
       .Replace(".jpg", "") 
       .Replace(".png", ""); 
} 

在SQL字段 「PhotoFolder」 是一個爲nvarchar(50)。如果有記錄的照片,則該字段的數字爲100或更多,它會擦除​​包含照片的文件夾。如果沒有照片備案,該字段包含「空」

我也有嘗試:

<asp:Button ID="Button2" runat="server" Text="Foto" Visible='<%# Eval("PhotoFolder").ToString() != "Null" %>' 

但是按鈕中的所有行,而不僅僅是那些有一個字符串顯示(數字)在「PhotoFolder」

回答

0

根據你的問題,你應該寫代碼檢查包含圖像的行, 你可以寫在RowDataBound事件的代碼,並且按鈕的Visible屬性設置爲false,該行這沒有按」 t包含圖像。

0

試試這個。

標記

Visible='<%# HideEmptyPhotoFolder(Eval("PhotoFolder")) %>' 

代碼隱藏

protected bool HideEmptyPhotoFolder(object photoFolder) 
{ 
    return photoFolder != null && !String.IsNullOrEmpty(photoFolder.ToString()); 
} 
+0

你描述的工作正常,但實際上它可以縮短更多。 它也以如下方式工作,不使用Code-Behind:Visible ='<%#!String.IsNullOrEmpty(Eval(「PhotoFolder」)。ToString())%>'Thankyou! – 2013-02-15 12:06:53

+0

@SørenGinderskov:如果Eval對象返回的值爲null,該怎麼辦?我只是選擇了其中一種方法。想要更多的可讀性:) – naveen 2013-02-15 12:40:40

1

它可以內嵌代碼來實現簡單

<asp:ImageButton ID="ibtnBranchType1" runat="server" ImageUrl='<%# "~/images/" + Eval("branchtype1")+".png" %>' Visible='<%# Convert.ToString(Eval("branchtype1"))=="" ? false : true %>' Height="20px"/> 

這裏的eval( 「branchtype1」)我們得到的id值從像1,2,3等數據表,我們的圖像文件夾包括像1.png,2.png,3.png等圖像,

Visible='<%# Convert.ToString(Eval("branchtype1"))=="" ? false : true %>' 

如果值不包含任何id,它將得到空值。我們將使用三元運算符將它與空字符串進行比較。