Pergunta

Eu estou usando jQuery para tentar desencadear um método quando um ASP.NET evento de alteração (2,0) da lista suspensa é tratado pelo jQuery. O problema é que na lista suspensa está localizado dentro de um gridview e mesmo assim somente quando um usuário decidiu editar uma linha dentro desse gridview.

Eu acho que tenho que pegar o objeto usando um bloco de código ASP, mas o problema com isto é que quando a página é carregada pela primeira vez o índice de edição da linha não existe e ele lança um erro. Colocar o bloco dentro de uma instrução IF também não funciona.

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

É uma tentativa que eu fiz, e eu também tentei colocar o IF código ASP fora do bloco de JavaScript. Ele não quer trabalhar.

Como eu poderia aplicar o evento jQuery para a caixa de queda a queda? Idealmente o mais conciso possível.


Obrigado pela resposta, mas não, ele não funciona :(. O código JavaScript parece não ser emitido ... Confundindo ...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

é a saída. Mesmo que este é o código:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

Ele estava fazendo isso antes, bem, me deixando louco.


Desculpe, você poderia fazer isso um pouco mais claro. Tentei definir a coisa toda em código por trás assim:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

É isso que você queria dizer?

BTW, o acima não funcionou. Sem erros, apenas há eventos trabalhou.

Foi útil?

Solução

Um par de coisas aqui.

  1. Você precisa envolver seus seletores entre aspas quando você passá-las para a função $(). O trecho de código acima gera algo como $(#some-generated-id), que não vai funcionar.
  2. A chave de fechamento para o lado seu servidor se declaração foi fora da função onready. Ele precisa ser aninhados no mesmo nível como a abertura se.

Tente esta:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

Se ele não funciona, vá em frente e cole o javascript gerado também.

Outras dicas

Use esta:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

É falso para não criar as tags de script desde que você está incluindo-los. A documentação MSDN está errado na forma como ele explica a bandeira.

Além disso, basta colocar o ID do cliente é de seus controles em variáveis ??separadas do código por trás, e não o jQuery código .

Em seguida, use as variáveis ??que contêm os ids vez em código jQuery.

Dentro do seu bloco de script que você criar no código por trás:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

Eu não verificar essa sintaxe, mas deve estar perto. Você pode adicionar a sintaxe adicional para si mesmo grvTimeSheets.ClientID. Se você começar este trabalho, então você pode querer mudá-lo para construir uma matriz de JavaScript e armazenar da ClientId dessa maneira, e, em seguida, você só tem uma variável global JavaScript que você precisa para trabalhar.

Outra opção é apenas dar o elemento que você está procurando um nome de classe que descreve o seu comportamento. Em seguida, seu código jQuery torna-se muito claro:

$(function() {
    $("select.yourMarkerClass").change(....);
});

Se não houver nenhuma linha de edição, então este código não faz nada. Se houver um elemento que combina com o seletor, você vai ter o novo comportamento acrescentou.

Se você não está usando o mesmo ID em outro lugar na página, você pode frustrar ASP. NET 's UniqueID com um dos seletores avançados do jQuery:

$('[id$=ddlClients]')

Esta corresponde apenas ao final da string id ao invés do todo. Tenha em mente, se o controle está presente várias vezes dentro de linhas diferentes, isto irá corresponder a todos os casos.

Veja Seletores para mais exemplos.

Eu usei o Page.ClientScript propriedade para registrar um bloco de script para conter necessidade I de qualquer id para acesso com jQuery.

Aqui está um exemplo do meu JavaScript em um arquivo externo:

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlId é definido a partir do código por trás e registerd na ClientScriptBlock.

A chave pode ser o que quiser, deve ser embora único.

Vou tentar mais após o fim de semana. Este foi o código, no entanto:

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);

Porque você tem uma lista suspensa em cada linha. Cada suspensa terá um único ClientId, então eu sugiro fazer o que Ben sugeriu e use o seletor de classe, uma vez que é a solução mais simples.

Ou você poderia criar uma função JavaScript em sua edição clique e, em seguida, obter o ID de cliente exclusivo do seu suspensa nessa linha que está sendo editado.

Desculpe, eu deveria ter lido o seu código mais perto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top