Pregunta

Estoy usando Visual Studio 2008 con .NET Framework 3.5. Tengo un DataGrid con un linkbutton dentro de un templateColumn. Estoy tratando de averiguar cómo deshabilitar la capacidad de hacer clic en LinkButton una vez que se ha hecho clic. Mi DataGrid tiene 6 columnas con la columna LinkButton que muestra años y los otros que muestran los datos de fin de año para esos años. Cuando se hace clic en el año, el DataGrid muestra un desglose de los datos de ese año de un mes a mes. Cuando el DataGrid muestra el desglose mes a mes, todavía necesito que la columna Año sea visible, pero sin la capacidad de hacer clic. También tengo un botón y un gráfico que, por defecto, la visibilidad se establece en FALSE, pero después de que se selecciona un año, la visibilidad se establece en VERDADERO con el botón que da la capacidad de cerrar el mes por mes a partir del mes a partir del año. Desglose de fin. Tengo todo funcionando, excepto la incapacidad del BETBOTONTON.

Aquí está el código para My DataGrid's TemplateColumn:

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

He intentado lo siguiente:

intento 1 usando código detrás:

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

intento 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>

- El tercer intento fue cercano, lo que hizo grises los botones de LinkButto, pero no se deshabilizó la capacidad de hacer clic en ellos Intento 3 usando la propiedad 'habilitada':

<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>

Algunos otros pensamientos que tengo incluir utilizando un evento 'OnClick' o un 'comandargument'. Intenté usar 'OnClick' y en el código detrás de simplemente usando:

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

Cualquier ayuda, pensamientos, ideas, ejemplos, etc. sería muy apreciado. ¡Gracias a todos por adelantado!

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());
}

¿Fue útil?

Solución 2

Polity, thank you very much for your help, I really appreciate it. I found a different way to go about fixing this issue though.

.ASPX Code:

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

.ASPX.CS Code:

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;
    }
}

Otros consejos

Option 3 and your last approach seem to be the way to go. The problem with LinkButtons is that even by putting Enabled on false, you wont block them from posting back. See: http://weblogs.asp.net/jeffwids/archive/2011/02/14/how-to-disable-an-asp-net-linkbutton-when-clicked.aspx

Therefore you have to do this manually with:

lb.Attributes.Add("onclick", "this.href='#';this.disabled=true;" + Page.ClientScript.GetPostBackEventReference(lb, "").ToString());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top