2013-02-15 3 views
2

일부 행에 그림이 첨부 된 격자보기가 있습니다. Button2를 누르면 그림이있는 서버의 폴더에 대한 SQL 레코드에서 정보를 가져옵니다. 이 방법은 이미 작동하지만 버튼이 이미지 폴더가 연결된 행에만 표시되도록 할 수 없습니다.필드가 Null 인 경우 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로 설정할 수 있습니다. 이미지가 포함되어 있지 않습니다.

0

시도해보십시오.

마크 업

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

코드 숨김

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

당신이 묘사 한 내용은 문제가 없지만 실제로는 더 짧아 질 수 있습니다. 코드 비하인드를 사용하지 않고 다음과 같은 방식으로 작동합니다. Visible = '<% #! String.IsNullOrEmpty (Eval ("PhotoFolder"). ToString()) %>'Thankyou! –

+0

@ SørenGinderskov : 개체 Eval이 반환되는 경우 null입니다. 방금 작동하는 방법 중 하나를 선택했습니다. 가독성을 더 원했습니다 :) – naveen

1

은 여기

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

평가 ("branchtype1")는 우리가 ID 값을 받고 인라인 코드로 간단하게 달성 할 수있다 1, 2, 3 등의 데이터 테이블에서 우리의 이미지 폴더는 1.png, 2.png, 3.png 등의 이미지로 구성됩니다.

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

값에 ID가 포함되지 않으면 null이 반환됩니다. 삼항 연산자를 사용하여 빈 문자열과 비교합니다.