Inquiridor
Campos do repeater retornam valores em branco ao salvar

Discussão Geral
-
Estou exibindo o resultado de uma tabela em um repeater para edição, acontece que ele exibe corretamente, mas quando tento usar dados digitados pelo usuário ele simplesmente ignora e não salva o novo valor no bd.
.ASPX
<asp:SqlDataSource ID="SqlEditPeriodo" runat="server" ConnectionString="<%$ ConnectionStrings:vbd %>" ProviderName="<%$ ConnectionStrings:vbd.ProviderName %>" > </asp:SqlDataSource> <asp:Repeater ID="rpEditPeriodo" runat ="server" Visible="False" > <HeaderTemplate> <table width="80%" border="0" cellspacing="4" cellpadding="4" id="dataTable" class="TabLancametos"> <thead> <tr> <th>Edit</th> <th>Mês</th> <th>Remuneração</th> </tr></thead> </HeaderTemplate> <ItemTemplate> <tbody><tr> <td><asp:TextBox ID="txtano" runat="server" Text='<%# cdate(eval ("periodo")).Year %>' Enabled="false" ></asp:TextBox></td> <td><asp:TextBox ID="txtmes" runat="server" Text='<%# cdate(eval ("periodo")).tostring("MMMM") %>' Enabled="false"></asp:TextBox></td> <td><asp:TextBox ID="txtremEdit" runat="server" ></asp:TextBox></td> <td><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td> </tr></tbody> </ItemTemplate> <footerTemplate> </table> </footerTemplate> </asp:Repeater> <asp:Button runat="server" Text="Button" id="btn1"/>
Code Behind
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim vprotocolo As String = "201294736632" rpEditPeriodo.Visible = True SqlEditPeriodo.SelectCommand = "Select * from ctc_rem where protocolo = '" & vProtocolo & "' order by periodo asc" rpEditPeriodo.DataSource = SqlEditPeriodo rpEditPeriodo.DataBind() End Sub Private Sub insertEdit(ByVal protocolo As String) For Each item As RepeaterItem In rpEditPeriodo.Items Dim ano As TextBox = DirectCast(item.FindControl("txtano"), TextBox) Dim mes As TextBox = DirectCast(item.FindControl("txtmes"), TextBox) Dim vrem = item.FindControl("txtremEdit") Dim x1 As TextBox = DirectCast(item.FindControl("TextBox1"), TextBox) Dim dataconvert As Date = "1/" & Convert.ToDateTime("1/" & mes.Text & "/" & ano.Text).Month & "/" & ano.Text Dim datarem As String = Replace(dataconvert, "-", "/") 'Insere valores na tabela ctc_rem' SqlEditPeriodo.SelectCommandType = SqlDataSourceCommandType.Text SqlEditPeriodo.UpdateCommand = " " _ & "UPDATE ctc_rem SET " _ & "protocolo = '" & protocolo & "', " _ & "periodo = '" & Format(CDate(dataconvert), "yyyy-MM-dd") & "', dataatual = '" & Format(CDate(Now()), "yyyy-MM-dd") & "', " _ & "entidade='" & Request.Cookies("xentidade").Value & "', servidor = '" & Request.QueryString("c") & "', " _ & "rem = '" & x1.Text & "' WHERE protocolo = '" & protocolo & "' " SqlEditPeriodo.Update() Next End Sub Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click insertEdit("201294736632") End Sub
quero que o usuario possa alterar os textbox que contém os valores ("rem").
Alebarros
Todas as Respostas
-
Alessandro,
Acho que você deve informar o UpdateCommand juntamente a declaração do SqlDataSource, veja este tutorial:
http://stonecoastwebdesign.com/code/EditRepeater.aspxVitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
-
Ola, então nunca utilize o codigo dessa forma que você esta usando na verdade o formato de gravação, mas ver se consigo te ajudar
Dim cmd = new OleDbCommand();
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = ""
cmd.CommandText += "UPDATE ctc_rem SET "
cmd.CommandText += "protocolo = '" & protocolo & "',"
cmd.CommandText += "periodo = '" & Format(CDate(dataconvert), "yyyy-MM-dd") & "',"
cmd.CommandText += "dataatual = '" & Format(CDate(Now()), "yyyy-MM-dd") & "',"
cmd.CommandText += "entidade = '" & Request.Cookies("xentidade").Value & "',"
cmd.CommandText += "servidor = '" & Request.QueryString("c") & "',"
cmd.CommandText += "rem = '" & x1.Text & "' "
cmd.CommandText += "WHERE protocolo = '" & protocolo & "'"
cmd.ExecuteNonQuery()
Eu sempre utilizo o codigo nesse formato para gravar registros seja Insert / Update / Delete, você declara a variavel tipo OledbCommand fora do seu laço juntamente com a linha de conexão com o Banco de Dados e o CommandType dentro do laço você coloca somente o cmd.CommandText = "" e o cmd.CommandText = "update ....", dessa forma o laço executara todo o seu UPDATE, mas outra coisa você ja colocu um breakpoint e pegou o resultado do seu UPDATE para ver como ele esta sendo montado ? Você ainda pode na linah do cmd.ExecuteNoQuery verificar se a instrução afetou registros e realizar um teste para validar nesses casos eu uso ate controle de transação pois se durante meu UPDATE dentro de um laço digamos que meu 5 UPDATE falhar eu desfaço toda a transação. Não sei se ajuda muito mas faz um teste ai
Junior
-
Fiz desta forma também, o problema não está na gravação e sim que não consigo resgatar os dados colocados nos Textbox do repeater.
Quando o usuario digita qualquer valor no textbox ele simplesmente ignora, mas se eu atribuir um valor ao textbox no code antes da gravação ele aceita. Mesmo fazendo um response.write do campo ele não mostra nada.
Alebarros
-
Eu nunca usei o repeater mas ja montei gridview em que algumas colunas eram textboxs com valores a serem alterados pelo usuario e depois atraves da ação de um button realizava a gravação dos registros da grid
protected void btnGravar_Click(object sender, EventArgs e)
{
string sQtdade = "";
string sValor = "";
cmd = new OleDbCommand();
cmd.Connection = cn;
foreach (GridViewRow row in Grid.Rows)
{
sQtdade = "";
sValor = "";
sQtdade = ((TextBox)row.Cells[2].Controls[1]).Text;
sValor = ((TextBox)row.Cells[3].Controls[1]).Text;
cmd.CommandText = "";
cmd.CommandText = "UPDATE COTACAO SET QTDADEPROD = " + sQtdade.Replace(",",".") + ", VALORPROD = " + sValor.Replace(",",".") + "
WHERE CODPROD = " + row.Cells[0].Text;
cmd.ExecuteNonQuery();
}
}Tenta usar esse codigo como exemplo para ver se te ajuda pois com esse codigo fiz a alteração dos dados registros usando dados contidos nos campos da pagina dentro da grid ou seja dos textboxs
Junior
-
-
Tem sim você pode criar um gridview com uma ou mais colunas do tipo template e inserir textbox dentro dessa(s) coluna(s) você tera que realizar validações nos campos é claro e pode usar aquele codigo que te passei no post acima eu usei isso ja utilizando posts encontrados na net e ficou muito bom, para falar a verdade somente ate hoje não consegui me acertar um "probleminha" de foco em campo pois quando saio de um campo e jogo para o proximo em alguns casos o foco volta para o campo origem, mas olha ate agora funciona perfeitamente.
Junior