Fórum Como adaptar um DropDownList no lugar do TextBox para inserir um Valor - Ref. a aula IX #5153
29/04/2009
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" />
<asp:Button ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="Cancel" />
</InsertItemTemplate>
</asp:FormView>
Fico no aguardo e desde já agradeço
Posts
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" /> <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" /> <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") %>' /> <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
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
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
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.
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
Recupera o valor através do Hidden no TextChange, tira o bind.
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
Você já utilizou o Hidden? É bom simples
string valor = hdfID.Value;
Só isso.
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" />
<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
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
Desculpa mas não estou mais entendendo sua dúvida. Você consegue dar um print em uma tela do que precisa?
Aqui está o PrintScreen da Tela
Aqui está o PrintScreen da Tela
Aqui está o PrintScreen da Tela