Pergunta

Estou usando o Visual Studio 2008 com .NET Framework 3.5.Eu tenho um DataGrid com um LinkButton dentro de um TemplateColumn.Estou tentando descobrir como desativar a capacidade de clicar no LinkButton depois de clicado.Meu DataGrid possui 6 colunas com a coluna LinkButton exibindo anos e as outras exibindo dados de final de ano para esses anos.Quando um ano é clicado, o DataGrid exibe um detalhamento dos dados daquele ano mês a mês.Quando o DataGrid está exibindo o detalhamento mês a mês, ainda preciso que a coluna do ano esteja visível, mas sem a capacidade de clicar.Eu também tenho um botão e um gráfico que, por padrão, a Visibilidade é definida como falsa, mas depois de um ano ser selecionado, a Visibilidade é definida como verdadeira com o botão que permite fechar o detalhamento mês a mês e retornar ao ano colapso final.Tenho tudo funcionando exceto a desativação do LinkButton.

Aqui está o código para TemplateColumn do meu DataGrid:

<asp:TemplateColumn HeaderText="Year End">
    <ItemTemplate>
        <asp:LinkButton runat="server" ID="lbYear" Text='<%# DataBinder.Eval(Container, "DataItem.year") %>'></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateColumn>

Eu tentei o seguinte:

Tentativa 1 usando code-behind:

protected void Page_Load(object sender, EventArgs e)
{
    LinkButton lb = ((LinkButton) FindControl("lbYear"));
    lb.Attributes.Add("onClick", "return false;");
}

Tentativa 2 usando Javascript:

function disableLinkButton() {
    var lb = document.getElementById("lbYear");
    if (lb.disabled != true) { lb.disabled = true; return true; }
    }
    else { return false; }
}

<asp:TemplateColumn HeaderText="Year End">
    <ItemTemplate>
        <asp:LinkButton runat="server" ID="lbYear" OnClientClick="disableLinkButton()" Text='<%# DataBinder.Eval(Container, "DataItem.year") %>'></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateColumn>

- A 3ª tentativa foi próxima, o que fez cinza para fora os LinkButtons, mas não desativou a capacidade de clicar neles Tentativa 3 usando a propriedade 'Enabled':

<asp:TemplateColumn HeaderText="Year End">
    <ItemTemplate>
        <asp:LinkButton runat="server" ID="lbYear" Enabled='<%# Convert.ToInt32(DataBinder.Eval(Container.DataItem, "year"))==1?Convert.ToBoolean("True"):Convert.ToBoolean("False") %>' Text='<%# DataBinder.Eval(Container, "DataItem.year") %>'></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateColumn>

Algumas outras idéias que tenho incluem o uso de um evento 'OnClick' ou um 'CommandArgument'.Tentei usar 'OnClick' e no código por trás simplesmente usando:

LinkButton lb = ((LinkButton) FindControl("lbYear");
lb.Enabled = false;

Qualquer ajuda, pensamentos, ideias, exemplos, etc.seria muito apreciado.Obrigado a todos antecipadamente!

Código Ajustado:

<ItemTemplate>
    <asp:LinkButton ID="lbYear" runat="server" OnClick="testClick" Text='<%# DataBinder.Eval(Container, "DataItem.year") %>'></asp:LinkButton>
    <a id="MyContrl_lbYear" href="javascript:__doPostBack('MyContrl$lbYear','')" onclick="this.href='#';this.disabled=true;__doPostBack('MyContrl$lbYear','');"></a>
</ItemTemplate>

protected void showChart(object sender, EventArgs e)
{
    LinkButton lbYear = ((LinkButton)FindControl("lbYear"));
    lbYear.Attributes.Add("onclick", "this.href='#';this.disabled=true;" + Page.ClientScript.GetPostBackEventReference(lbYear, "").ToString());
}
Foi útil?

Solução 2

Polity, muito obrigado pela sua ajuda, eu realmente aprecio isso.No entanto, encontrei uma maneira diferente de corrigir esse problema.

Código .ASPX:

<TemplateColumn>
    <ItemTemplate>
        <asp:LinkButton runat="server" OnClick="test" Text='<%# DataBinder.Eval(Container, "DataItem.year") %></asp:LinkButton>
    </ItemTemplate>
</TemplateColumn>

Código .ASPX.CS:

protected void test(object sender, EventArgs e)
{
    foreach(var y in myDataGrid.Items)
    {
        LinkButton lb = ((y as TableRow).Cells[1].Controls[1] as LinkButton);
        lb.Enabled = false;
    }
}

Outras dicas

A opção 3 e sua última abordagem parecem ser o caminho a seguir.O problema com LinkButtons é que mesmo colocando Enabled em false, você não impedirá que eles postem de volta.Ver: http://weblogs.asp.net/jeffwids/archive/2011/02/14/how-to-disable-an-asp-net-linkbutton-when-clicked.aspx

Portanto, você deve fazer isso manualmente com:

lb.Attributes.Add("onclick", "this.href='#';this.disabled=true;" + Page.ClientScript.GetPostBackEventReference(lb, "").ToString());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top