2017-10-20 16 views
1

Je ne peux pas afficher les icônes de fichier en fonction des extensions de fichiers dans asp.net GridView.Affiche les icônes de fichier dans asp.net sur GridView

La structure de GridView est nested

Le tutoriel est Displays file icons in asp.net

L'erreur est:

Référence d'objet non définie à une instance d'un objet

Dans ce ligne de code-behind:

if (!String.IsNullOrEmpty(lnkDownload.Text)) 

Mon code ci-dessous.

Pouvez-vous m'aider?

Merci d'avance pour toute aide, vraiment appréciée.

<asp:TemplateField> 
    <ItemTemplate> 
     <img alt="" style="cursor: pointer" src="images/plus.png" /> 
     <asp:Panel ID="pnlOrders" runat="server" Style="display: none"> 
      <asp:GridView ID="gvOrders" runat="server" 
      AutoGenerateColumns="false" CssClass="mGrid" Width="700" 
      HorizontalAlign="Center"> 
       <Columns> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <img id="fileImage" runat="server" src="" /> 
          <asp:HiddenField ID="HiddenField1" 
        runat="server" Value='<%# Eval("Name") %>' /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Download" ItemStyle- 
        HorizontalAlign="Justify"> 
         <ItemTemplate> 
          <asp:LinkButton ID="lnkDownload" Text='<%# 
          Eval("Name") %>' CommandArgument= 
          '<%# Eval("FullName") %>' runat="server" 
           OnClick="lnkDownload_Click" 
           OnClientClick="if (!confirm('Confirm ?')) 
           return false;"></asp:LinkButton> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
      </asp:GridView> 
     </asp:Panel> 
    </ItemTemplate> 
</asp:TemplateField> 



protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string root = @FilePath; 
     string folder = GridView2.DataKeys[e.Row.RowIndex].Value.ToString(); 

     GridView gvOrders = (GridView)e.Row.FindControl("gvOrders"); 
     Label gvLabel = (Label)e.Row.FindControl("gvLabel"); 
     Label gvFolder = (Label)e.Row.FindControl("gvFolder"); 


     DirectoryInfo directory = new DirectoryInfo(root + "/" + folder); 
     FileInfo[] fileInfo = directory.GetFiles("*.*", 
     SearchOption.AllDirectories); 

     fCount = directory.GetFiles("*.*", 
     SearchOption.AllDirectories).Length; 
     gvLabel.Text = fCount.ToString(); 

     long size = 0; 
     foreach (string file in Directory.GetFiles(root + "/" + folder, 
     "*.*", SearchOption.AllDirectories)) 
     { 
      size += new FileInfo(file).Length; 
     } 

     gvFolder.Text = Math.Round((double)size/(double)(1024 * 1024), 
     2).ToString() + " MB"; 

     LinkButton lnkDownload = 
     (LinkButton)e.Row.FindControl("lnkDownload"); 
     HiddenField hf = (HiddenField)e.Row.FindControl("HiddenField1"); 

     if (!String.IsNullOrEmpty(lnkDownload.Text)) 
     { 
      HtmlImage image = (HtmlImage)e.Row.FindControl("fileImage"); 
      image.Attributes.Add("src", GetIconForFile(hf.Value)); 
     } 

     gvOrders.DataSource = fileInfo; 
     gvOrders.DataBind(); 
    } 
} 

private string GetIconForFile(string fileText) 
{ 
    string extension = Path.GetExtension(fileText); 
    extension = extension.Trim('.').ToLower(); 
    return "~/fileicons/" + extension + ".png"; 
} 
+1

Avez-vous lu http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do- i-fix-it déjà? '(LinkButton) e.Row.FindControl (" lnkDownload ")' peut renvoyer une valeur nulle si le contrôle n'existe pas, puis lancer NRE lors de l'accès à la propriété 'Text' de celui-ci. –

+0

quelle structure utilisez-vous? Imbriqué ou simple? – AsifAli72090

+0

@ Asif.Ali imbriqué –

Répondre

1

Vous avez un Nested GridView Structure et gvOrders est votre GridView intérieure. Donc, vous avez pour obtenir LinkButton de la rangée de GridView intérieure comme comme:

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     GridView gvOrders = (GridView)e.Row.FindControl("gvOrders"); 

     foreach (GridViewRow row in gvOrders.Rows) 
     { 
      LinkButton lnkDownload = (LinkButton)row.FindControl("lnkDownload"); 
      HiddenField hf = (HiddenField)row.FindControl("HiddenField1"); 

      if (!String.IsNullOrEmpty(lnkDownload.Text)) 
      { 
       //... some code 
      } 
     } 
    } 
}