none
Acessar Control dentro do PlaceHolder RRS feed

  • Pergunta

  • Pessoal, bom dia. Tenho um placeholder em minha pagina e preciso que, dependendo de uma condição, ele seja fileupload, ou simplesmente um label com algo escrito, o código está assim:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                {
                    if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        PlaceHolder p = e.Row.FindControl("PlaceHolder1") as PlaceHolder;
                        System.Web.UI.WebControls.Label d = e.Row.Cells[1].FindControl("lblTitulo") as System.Web.UI.WebControls.Label;


                        if (d.Text == "CONTRATO")
                        {
                            FileUpload fl = new FileUpload();

                            p.Controls.Add(fl);

                        }
                        else
                        {
                            System.Web.UI.WebControls.Label l = new System.Web.UI.WebControls.Label();
                            l.Text = "Arquivo Comum";
                            p.Controls.Add(l);
                        }

                    }
                }
            }

    Até então, tudo muito correto, porém, quando eu chamo o evento do click do meu botão para salvar no banco, ele da problema:

     protected void Button2_Click(object sender, EventArgs e)
            {
                using (Context ctx = new Context())
                {
                    foreach (GridViewRow row in GridView1.Rows)
                    {
                        System.Web.UI.WebControls.Label idL = row.Cells[0].FindControl("lblId") as System.Web.UI.WebControls.Label;
                        PlaceHolder ph = (PlaceHolder)row.FindControl("PlaceHolder1");
                        FileUpload fl = (FileUpload)ph.FindControl("fl");
                        
                        int id = Convert.ToInt32(idL.Text);
                        var obj = ctx.Arquivos.Where(x => x.ArquivosId== id).First();
                        //obj.Url = fl.PostedFile.ToString();
                        ctx.SaveChanges();

                    }

                }
            }

    EM NEGRITO: ele não consegue encontrar fileupload de forma alguma, e eu ja testei inumeras vezes, com breakpoint, e ele adiciona no placeholder corretamente, mas na hora de rodar, ele vem como "Null"... no caso, o FileUpload dentro do placeholder... ("fl")... ALguma ideia que possa auxiliar ???

                                              
    terça-feira, 26 de agosto de 2014 13:26

Todas as Respostas

  • Nenhuma opinião galera ... ?
    terça-feira, 26 de agosto de 2014 14:36
  • Olá Rafa,

     esse FileUpload está na master page correto ? Como está seu aspx dessa pagina ?

    terça-feira, 26 de agosto de 2014 17:00
  • Não meu amigo, está em uma outra página, porém utilizo a master page como layout sim... aqui está o código em aspx de minha pagina aonde está localizado o placeholder:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Forn.Master" AutoEventWireup="true" CodeBehind="Arquivos_Forn.aspx.cs" Inherits="consultor3.Arquivos_Forn" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

        <asp:DropDownList ID="DropDownList1" runat="server">
            <asp:ListItem>CNPJ</asp:ListItem>
            <asp:ListItem>ID</asp:ListItem>
            <asp:ListItem>COMPROVANTE</asp:ListItem>
            <asp:ListItem>CONTRATO</asp:ListItem>

        </asp:DropDownList>
        <asp:Button ID="Button1" runat="server" Text="Adicionar"
            onclick="Button1_Click" /> <br /><br />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            CellPadding="3" DataKeyNames="ArquivosId" DataSourceID="SqlDataSource1"
            Height="87px" Width="212px" BackColor="#DEBA84" BorderColor="#DEBA84"
            BorderStyle="None" BorderWidth="1px" CellSpacing="2"
            onrowdatabound="GridView1_RowDataBound">
            <Columns>
              <asp:TemplateField HeaderText="ID">
                <ItemTemplate>
                <asp:Label id="lblId" text=<%#Eval("ArquivosId") %> runat="server" />
                </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Arquivos Solicitados/Enviados">
                <ItemTemplate>
                <asp:Label id="lblTitulo" text=<%#Eval("Titulo") %> runat="server" />
                </ItemTemplate>
                </asp:TemplateField>
                
                 <asp:TemplateField HeaderText="STS">
                <ItemTemplate>
                    <asp:Image ID="Image1" runat="server" ImageUrl=<%#Eval("Sts") %>/>
                </ItemTemplate>
                </asp:TemplateField>

              <asp:TemplateField HeaderText="Upload">
                <ItemTemplate>
                    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
                </ItemTemplate>
                </asp:TemplateField>
         
                     <asp:TemplateField HeaderText="Download">
                <ItemTemplate>
                    <asp:LinkButton ID="OnLnkDownload" PostBackUrl=<%#Eval("Url") %> runat="server"
                        Font-Underline="False" onclick="OnLnkDownload_Click">Download</asp:LinkButton>
                </ItemTemplate>
                </asp:TemplateField>

            </Columns>

            <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
            <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
            <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
            <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
            <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
            <SortedAscendingCellStyle BackColor="#FFF1D4" />
            <SortedAscendingHeaderStyle BackColor="#B95C30" />
            <SortedDescendingCellStyle BackColor="#F1E5CE" />
            <SortedDescendingHeaderStyle BackColor="#93451F" />

        </asp:GridView>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:MCVConnectionString %>"
            SelectCommand="SELECT * FROM [Arquivos]"></asp:SqlDataSource>

        <br />
        <center>
            <asp:Button ID="Button2" runat="server" Text="Enviar" BackColor="#0033CC"
            ForeColor="White" Width="74px" onclick="Button2_Click" /></center>

    </asp:Content>

    terça-feira, 26 de agosto de 2014 17:10
  • Mas você não deu um "ID" para seu FileUpload nem para o Label, provavelmente ele não vai encontrar nenhum dos dois controles, quando você cria o controle em Runtime de um "nome" a ele e busque por esse mesmo nome !
    terça-feira, 26 de agosto de 2014 17:54
  • Meu fileupload e o label são ambos criados dinamicamente, logo, dentro do devido placeholder, por isso esse problema perssistir
    quarta-feira, 27 de agosto de 2014 00:45

  •                 if (e.Row.RowType == DataControlRowType.DataRow)
                    {
                        PlaceHolder p = e.Row.FindControl("PlaceHolder1") as PlaceHolder;
                        System.Web.UI.WebControls.Label d = e.Row.Cells[1].FindControl("lblTitulo") as System.Web.UI.WebControls.Label;


                        if (d.Text == "CONTRATO")
                        {
                            FileUpload fl = new FileUpload();

                            p.Controls.Add(fl);

                        }
                        else
                        {
                            System.Web.UI.WebControls.Label l = new System.Web.UI.WebControls.Label();
                            l.Text = "Arquivo Comum";
                            p.Controls.Add(l);
                        }
    quarta-feira, 27 de agosto de 2014 00:47
  • Entendi,

     faça dessa maneira para pegar o controle dentro de seu Placeholder :

    foreach (GridViewRow row in GridView1.Rows)
                {
    
                    PlaceHolder ph = (PlaceHolder)row.FindControl("PlaceHolder1");
    
                    if (ph.Controls.Count > 0)
                    {
    
                        FileUpload fl = ph.Controls.OfType<FileUpload>().FirstOrDefault();
    
                        //resto de seu codigo...
                       
    
                    }
    
                }

    quarta-feira, 27 de agosto de 2014 10:50