Fórum Como adaptar um DropDownList no lugar do TextBox para inserir um Valor - Ref. a aula IX #5153

29/04/2009

0

A/C Fabio Galante Mans       Estou acompanhando fielmente o seu curso, grande CORINTHIANO,  e consegui adaptar a classe category.cs como já havia tirado duvida em tópico passado para Visualizar uma determinada subcategoria dentro de uma categoria como é mostrado abaixo nas store procedures e classe category.cs      Procedure dev_CategoryInsert Adaptada para adicionar uma Categoria ou Grupo á uma subCategoria ou Title ALTER PROCEDURE [dbo].[dev_CategoryInsert] ( @Grupo NVarchar(150), @Title NVarchar(150) ) AS INSERT dev_Categories ( Grupo, Title ) VALUES ( @Grupo, @Title ) Como ficou a SP CategorySelect Adptada para aceitar o campo Grupo tb ALTER PROCEDURE [dbo].[dev_CategorySelect] ( @Id Int ) AS SELECT CategoryId, Grupo, Title FROM dev_Categories WHERE CategoryId = @Id E a procedure Select All Category (tb adaptada para consultar o grupo ao qual pertence os Titles (ou subcategorias) ALTER PROCEDURE [dbo].[dev_SelectAllCategory] ( @Grupo VarChar(150) ) AS SELECT CategoryID, Title FROM dbo.dev_Categories Where Grupo = @Grupo ORDER BY Title SET NOCOUNT ON RETURN Os demais SP continuam a mesma coisa pois por enquanto não necessitaram de alterações   Agora a classe Category.cs adaptada para este fim veja como ficou Fabio   using System; using System.Data; using System.Configuration; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Web.Configuration; namespace DevMedia.ECommerce { /// <summary> /// Representa a Categoria de um Produto ou Serviço /// e contem métodos para trabalhar com a Categoria /// </summary> [System.ComponentModel.DataObject] public class Category { private static readonly string _connectionString; private int _id; //private string _grupo; private string _title; public int CategoryID { get { return _id; } set { _id = value; } } //public string Grupo ///{ //get { return _grupo; } //set { _grupo = value; } /// } public string Title { get { return _title; } set { _title = value; } } static Category() { _connectionString = WebConfigurationManager.ConnectionStrings["StoreString"].ConnectionString; } public Category(SqlDataReader reader) { _id = (int)reader["CategoryID"]; //_grupo = (string)reader["Grupo"]; _title = (string)reader["Title"]; } /// <summary> /// Seleciona Todas as Categorias do Banco de Dados /// </summary> /// <returns></returns> [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select,true)] public static List<Category> SelectCategory() { string Grupo = HttpContext.Current.Request.QueryString["sessao"];//sessao é um parametro vindo de um sitemap com menu por exemplo produtos -> categorias e outro menu serviços -> categorias (onde grupo seria produtos ou serviços e as categorias seriam listadas mediante o grupo solicitado(consegui fz essa adaptação e funcionou corretamente sem erros) //Inicializar Comando SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_SelectAllCategory", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@Grupo", Grupo); List<Category> results = new List<Category>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { results.Add(new Category(reader)); } con.Close(); return results; } } /// <summary> /// Seleciona Todas as Categorias do Banco de Dados /// Baseado na SubSessao em Servios /// </summary> /// <returns></returns> [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)] public static List<Category> Services() { string Grupo = HttpContext.Current.Request.QueryString["subsessao"]; //Inicializar Comando SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_SelectAllCategory", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@Grupo", Grupo); List<Category> results = new List<Category>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { results.Add(new Category(reader)); } con.Close(); return results; } } /// <summary> /// Seleciona uma Categoria por Category ID /// </summary> /// <param name="CategoryID"></param> /// <returns></returns> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] public static Category SelecById(int CategoryID) { //Inicializar o Command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategorySelect", con); cmd.CommandType = CommandType.StoredProcedure; //Inicializar Parameters p/ Evitar SqlInjection cmd.Parameters.AddWithValue("@Id", CategoryID); //Criar Variavel para Retorno de Resultados Category result = null; using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) result = new Category(reader); } con.Close(); return result; }//<summary> //Create a new category //</summary> //<param name="parentId"></param> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)] public static void Insert(string grupo, string title) { //Initialize command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryInsert ", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@Grupo", grupo); cmd.Parameters.AddWithValue("@Title", title); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); } /// <summary> /// Update numa CategoryID Existente /// </summary> /// <param name="CategoryId"></param> /// <param name="Title"></param> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)] public static void Update(int CategoryId, string Title) { //Inicializar o Command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryUpdate", con); cmd.CommandType = CommandType.StoredProcedure; //Inicializar Parameters p/ Evitar SqlInjection cmd.Parameters.AddWithValue("@Id", CategoryId); cmd.Parameters.AddWithValue("@Title", Title); using (con) { con.Open(); cmd.ExecuteNonQuery(); } con.Close(); } /// <summary> /// Delete a category /// </summary> [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)] public static void DeleteCat(int CategoryId) { // Initialize command SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_CategoryDelete", con); cmd.CommandType = CommandType.StoredProcedure; // Initialize parameters cmd.Parameters.AddWithValue("@CategoryId", CategoryId); using (con) { con.Open(); cmd.ExecuteNonQuery(); } } } } Á duvida seria na hora da inserção no formview no lugar de colocar Grupo como TextBox abaixo como seria o mesmo source abaixo com ele sendo um DropDownList com valores (Produtos e Serviços) por exemplo.esta é a minha duvida desta lição por enquanto <asp:FormView ID="frmAdd" runat="server" DefaultMode="Insert" DataSourceID="dsCategory" oniteminserted="frmAdd_ItemInserted"> <InsertItemTemplate> Grupo: <asp:TextBox ID="txtGrupo" runat="server" Text='<%# Bind("Grupo") %>' /> //Como aqui seria no caso se fosse usado um DropDownList com valores (Produtos e Serviços) para serem inseridos no Bind("Grupo")? <br /> Title: <asp:TextBox ID="txtTitle" runat="server" Text='<%# Bind("Title") %>' /> <br /> <asp:RequiredFieldValidator ID="reqTitle" runat="server" ControlToValidate="txtTitle" ErrorMessage="(Requerido)"></asp:RequiredFieldValidator> <br /> <br /> <asp:Button ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" /> &nbsp;<asp:Button ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" /> </InsertItemTemplate> </asp:FormView>   Fico no aguardo e desde já agradeço
Luiz Franco

Luiz Franco

Responder

Posts

30/04/2009

Fabio Mans

Luiz não sei se você já chegou na aula que mostra a página de administração de produtos, neste página é carregado um Drop com as categorias, o que você tem que fazer é a mesma coisa.

Você precisa criar uma método para carregar os dados que precisar, e preencher o Drop. Em seguida definir um DataSource para o drop.

DataSourceID="sqlDsCategory"


<asp:FormView ID="frmAdd" DefaultMode="Insert" DataSourceID="srcProducts" runat="server"
        OnItemInserted="frmAdd_ItemInserted" OnItemCommand="frmAdd_ItemCommand">
       
       
        <InsertItemTemplate>
       
            <asp:Label ID="lblName" Text="Name:"  runat="server" AssociatedControlID="txtName" />
           
            <asp:RequiredFieldValidator ID="reqName" ControlToValidate="txtName" Text="(Required)"
                ValidationGroup="Add" runat="server" />
               
            <div class="instructions">
                Enter the name of the product.
            </div>
           
            <asp:TextBox ID="txtName" Text='<%# Bind("Title") %>' runat="server" />&nbsp;<br />
            <br />
       
           
           
                <asp:Label ID="lblCategory" Text="Category:" runat="server" AssociatedControlID="drpCategory" />
                                    <asp:RequiredFieldValidator ID="reqCategory" runat="server" ControlToValidate="drpCategory"
                        ErrorMessage="(Requerid)" InitialValue="Choose a category" ValidationGroup="Add" />
               
               
                <div class="instructions">
                    Select a product category.<br />
                    <asp:DropDownList ID="drpCategory" runat="server" DataSourceID="sqlDsCategory"
                        DataTextField="Title" DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>' AppendDataBoundItems="True">
                        <asp:ListItem Selected="True">Choose a category</asp:ListItem>
                    </asp:DropDownList><br />

                    <asp:SqlDataSource ID="sqlDsCategory" runat="server" ConnectionString="<%$ ConnectionStrings:StoreString %>"
                        SelectCommand="SELECT [CategoryID], [Title] FROM [dev_Categories] ORDER BY [Title]">
                    </asp:SqlDataSource>
                  </div>
          
           <br />
                <asp:Label ID="lblPrice" Text="Price:" runat="server" AssociatedControlID="txtPrice" />
                <asp:RequiredFieldValidator ID="reqPrice" ControlToValidate="txtPrice" Text="(Required)"
                    Display="Dynamic" ValidationGroup="Add" runat="server" />
                <asp:CompareValidator ID="valPrice" ControlToValidate="txtPrice" Text="(Currency)"
                    Operator="DataTypeCheck" Type="Currency" ValidationGroup="Add" Display="Dynamic"
                    runat="server" />
                <div class="instructions">
                    Enter the product price.
                </div>
                <asp:TextBox ID="txtPrice" Columns="5" Text='<%# Bind("Price") %>' runat="server"  />
         
            <br style="clear: both" />
            <br />
            <asp:Label ID="lblDescription" Text="Brief Description (can include HTML):" AssociatedControlID="txtDescription"
                runat="server" />
            <asp:RequiredFieldValidator ID="reqDescription" ControlToValidate="txtDescription"
                Text="(Required)" ValidationGroup="Add" runat="server" />
            <div class="instructions">
                The brief description appears in the Products.aspx page and in advertisements.
            </div>
            <asp:TextBox ID="txtDescription" Text='<%#Bind("Description")%>' TextMode="multiLine"
                Columns="40" Rows="2" runat="server" />&nbsp;<br />
            <br />
            <br />
            <asp:Label ID="lblImage" Text="Image:" AssociatedControlID="upImage" runat="server" />
            <asp:RequiredFieldValidator ID="reqImage" runat="server" ControlToValidate="upImage"
                ValidationGroup="Add">(Required)</asp:RequiredFieldValidator><div class="instructions">
                (Optional)Upload a product image from your hard drive.
            </div>
            <asp:FileUpload ID="upImage" runat="server" FileName='<%# Bind("ImageURL") %>' />&nbsp;<br />
            <div>
            </div>
            <br />
            <asp:Button ID="btnAdd" Text="Add Product" CommandName="Insert" ValidationGroup="Add"
                runat="server" />
            <asp:Button ID="btnCancel" Text="Cancel" CausesValidation="false" CommandName="Cancel"
                runat="server" />
          
               
        </InsertItemTemplate>
       
       
    </asp:FormView>

Fabio
  
Responder

Gostei + 0

30/04/2009

Luiz Franco

Não não cheguei na aula que carrega as categorias para o Drop, qual é o numero da aula que vc fala sobre isso, agora por exemplo se fosse criar um método ou aproveitar alguma classe do Category.cs que carrega a lista de categorias seria  algo assim por exemplo   <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="dsCategory" DataTextField="Title" DataValueField="CategoryID"> </asp:DropDownList> <asp:ObjectDataSource ID="dsCategory" runat="server" OldValuesParameterFormatString="original_" SelectMethod="SelectCategory" TypeName="DevMedia.ECommerce.Category"></asp:ObjectDataSource> Que eu teria que embutir no codigo   Então eu teria que criar um novo DSource para isto   e nesse DataSource fazer ele enxergar esse metodo da classe Category.cs na guia Select ao configurar o DataSource no ObjectDataSource   /// <summary> /// Seleciona Todas as Categorias do Banco de Dados /// </summary> /// <returns></returns> [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select,true)] public static List<Category> SelectCategory() { string Grupo = HttpContext.Current.Request.QueryString["sessao"]; //Inicializar Comando SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand("dev_SelectAllCategory", con); cmd.CommandType = CommandType.StoredProcedure; //Initialize parameters cmd.Parameters.AddWithValue("@Grupo", Grupo); List<Category> results = new List<Category>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { results.Add(new Category(reader)); } con.Close(); return results; } }   Neste caso como eu tinha adaptado este método para sêr selecionado mediante as Categorias - Serviços ou Produtos mediante Request.QueryString do menu SiteMap eu teria que criar um outro método parecido nas classes somente para listar os Serviços e Produtos Vou passar para vc aqui como esta a minha estrutura atual de dados + procedure para vc entender o que eu to dizendo   CategoryID-Grupo-  Title 1 Produtos Componentes 2 Produtos Sites Prontos 3 Produtos Templates 4 Hospedagem Hospedagem Windows 5 Hospedagem Hospedagem Streaming 6 Produtos Web Controls NULL NULL NULL   Como está a minha SProcedure dev_SelectAllCategory agora   ALTER PROCEDURE [dbo].[dev_SelectAllCategory] ( @Grupo VarChar(150) ) AS SELECT CategoryID, Title FROM dbo.dev_Categories Where Grupo = @Grupo ORDER BY Title SET NOCOUNT ON RETURN Ou seja no caso para fazer o que eu quero e o que vc me disse seria então   A)Criar uma procedure parecida com ácima, mas no lugar de mostrar Select CategoryID, Title , mostrar um Select CategoryID, Grupo não usando Where Grupo = @Grupo e order by Grupo (ou ainda no caso utilizar o Select Order By Grupo Group By Grupo   B)Criar um método parecido com     [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select,true)] public static List<Category> SelectCategory() na classe Category.cs para ele enxergar esta nova SP citada na lógica A por exemplo o método poderia sêr Chamado de public static List<Category> SelectCategoryGrupo()  e o Select dele em (System.ComponentModel.DataObjectMethodType.Select,false)]   definido como false   C)Por fim da mesma forma que foi feito na inserção do mesmo na aula que vc fala e da exemplo de colocar o objetDataSource para categorias na lista do dropdownlist, criar um objet data source a mais nesta area admin para verificar a qual grupo esta categoria irá pertencer, ou ainda já que ele é definido para produtos -> categorias (já definir um hidden ou caixa de texto desabilitada mas com o valor Produtos dentro dele)Isso não tinha lembrado lembrei agora já que o meu site map administrativo tá ássim   Manager > Produtos > Categorias (não necessitaria de uma decisão dropdownlist, pois já pertence á Produtos)     e outro   Manager > Serviços > Categorias (não necessitaria de uma decisão dropdownlist, pois já pertence á Serviços)   è bom refletir acho que tv mais facil do que eu pensava   Mas mesmo assim gostaria que fosse dado um ok sobre se as minhas lógicas acima, caso eu precise se seria isso á sêr feito num caso destes   Fico no aguardo e desde já agradeço
Responder

Gostei + 0

01/05/2009

Luiz Franco

E aproveitando caso no lugar do DropDownList eu quiser usar mesmo o Controle TextBox ou o Controle Hidden da tab standard, como eu já deixaria ou no objeto hidden ou no objeto textbox o valor por exemplo "Produtos" já setado e pronto para sêr gravado sem que eu tivesse a necessidade de escrevê-lo na pagina fico no aguardo e desde já agradeço
Responder

Gostei + 0

05/05/2009

Fabio Mans

Olá eu utilizo bastante o Hidden, é bem simples.

hdfValor.Value = "seuvalor"

Assim você recupera no momento certo, era esta a dúvida? Acho que não é muito simples.

Responder

Gostei + 0

05/05/2009

Luiz Franco

Olá Fabio Galante mas no caso aí como eu faço para mudar esta linha     <asp:TextBox ID="txtGrupo" runat="server" Text='<%# Bind("Grupo") %>' ontextchanged="txtGrupo_TextChanged" />   para o HiddenField já com o valor ex:Produtos para sêr reconhecido na adição ou  na inserção do mesmo valor em <%# Bind("Grupo") %>   Fico no aguardo e desde já agradeço
Responder

Gostei + 0

11/05/2009

Fabio Mans

Recupera o valor através do Hidden no TextChange, tira o bind.
Responder

Gostei + 0

11/05/2009

Luiz Franco

Teria um exemplo de como eu fazer isso no source e no codigo ou seja como o HIDDEN ficaria no source e como o Bind receberia o dado na base de dados
Responder

Gostei + 0

15/05/2009

Fabio Mans

Você já utilizou o Hidden? É bom simples

string valor = hdfID.Value;

Só isso.


Responder

Gostei + 0

15/05/2009

Luiz Franco

Olá Fabio Galante não sei pq mas baseado no source abaixo não sei se estou fazendo corretamente     <custom:WebWindow ID="winAdd" runat="server" Hide="true" ShowCloseButton="False" Style="left: 23px; top: 459px" WindowTitleText="Adicionar Categoria"> <asp:FormView ID="frmAdd" runat="server" DefaultMode="Insert" DataSourceID="dsCategory" oniteminserted="frmAdd_ItemInserted"> <InsertItemTemplate> Grupo: <asp:TextBox ID="txtGrupo" runat="server" Text='<%# Bind("Grupo") %>' ontextchanged="txtGrupo_TextChanged" /> <asp:HiddenField ID="hdfID" runat="server" Value="Produtos" /> <br /> Title: <asp:TextBox ID="txtTitle" runat="server" Text='<%# Bind("Title") %>' /> <br /> <asp:RequiredFieldValidator ID="reqTitle" runat="server" ControlToValidate="txtTitle" ValidationGroup="Add" ErrorMessage="(Requerido)"></asp:RequiredFieldValidator> <br /> <br /> <asp:Button ID="InsertButton" ValidationGroup="Add" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" /> &nbsp;<asp:Button ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" /> </InsertItemTemplate> </asp:FormView> </custom:WebWindow> e no evento textchange do texbox txtGrupo como abaixo não sei pq ele não reconhece os valores para o txtGrupo e para sêr gravado na base de dados e no caso como eu faria para retornar o valor do campo hiddenfield ou até do string valor que tb não está sendo reconhecido para o bind.value para que ele grava-se o dado valor = "Produtos" na base de dados do dsCategory abaixo o evento e o datasource   protected void txtGrupo_TextChanged(object sender, EventArgs e) { //string valor = "Produtos"; string valor = hdfID.Value; } datasource   <asp:ObjectDataSource ID="dsCategory" runat="server" DeleteMethod="DeleteCat" InsertMethod="Insert" SelectMethod="SelectCategory" TypeName="WebProdutos.ECommerce.Category"> <DeleteParameters> <asp:Parameter Name="CategoryId" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="grupo" Type="String" /> <asp:Parameter Name="title" Type="String" /> </InsertParameters> </asp:ObjectDataSource> Aqui o code-behind completo   using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Manager_Category_Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void frmEdit_ItemUpdated(object sender, FormViewUpdatedEventArgs e) { //Carrega aps Update no FormView //O GridView atualizado grdCategories.DataBind(); } protected void grdCategories_SelectedIndexChanged(object sender, EventArgs e) { winEdit.Hide = false; } protected void frmEdit_ItemCommand(object sender, FormViewCommandEventArgs e) { winEdit.Hide = true; } protected void frmAdd_ItemInserted(object sender, FormViewInsertedEventArgs e) { grdCategories.DataBind(); } protected void txtGrupo_TextChanged(object sender, EventArgs e) { //string valor = "Produtos"; string valor = hdfID.Value; } }   Fico no aguardo e desde já agradeço    
Responder

Gostei + 0

21/05/2009

Fabio Mans

Conseguiu resolver?
Responder

Gostei + 0

21/05/2009

Luiz Franco

Não ainda não consegui resolver   A minha duvida consiste em como utilizando o Hidden Fiel, colocando como valor "Produtos" como assim que eu o inserir tb faço no code-behind para que ele seja gravado na base de dados ou class como explicada em sua aula?   Ou seja como baseado já nas minhas duvidas anteriores deveria ficar o source.aspx da pagina admin de cadastro de categorias e o code-behind da mesma para sêr gravada em sua base com hidden field  o valor do Grupo = "Produtos"?     Fico no aguardo e desde já agradeço
Responder

Gostei + 0

25/05/2009

Fabio Mans

Desculpa mas não estou mais entendendo sua dúvida. Você consegue dar um print em uma tela do que precisa?
Responder

Gostei + 0

25/05/2009

Luiz Franco

Aqui está o PrintScreen da Tela       
Responder

Gostei + 0

25/05/2009

Luiz Franco

Aqui está o PrintScreen da Tela       
Responder

Gostei + 0

25/05/2009

Luiz Franco

Aqui está o PrintScreen da Tela       
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar