Отключить LinkButton в DataGrid TemplateColumn - PullRequest
1 голос
/ 17 мая 2011

Я использую Visual Studio 2008 с .NET Framework 3.5. У меня есть DataGrid с LinkButton внутри TemplateColumn. Я пытаюсь выяснить, как отключить возможность нажимать кнопку LinkButton после ее нажатия. В моей DataGrid есть 6 столбцов, в столбце LinkButton показаны годы, а в других - данные на конец года за эти годы. При щелчке по году в DataGrid отображается разбивка данных этого года по месяцам. Когда DataGrid отображает разбивку по месяцам, мне все еще нужно, чтобы столбец года был виден, но без возможности щелкнуть. У меня также есть кнопка и диаграмма, которая по умолчанию имеет видимость «false», но после выбора года «Видимость» устанавливается на «истина» с помощью кнопки, которая дает возможность закрыть разбивку по месяцам и вернуться к году конец разбивки. У меня все работает, кроме отключения LinkButton.

Вот код для моей колонки TemplateGrid:

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

Я пробовал следующее:

Попытка 1 с использованием кода позади:

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

Попытка 2 с использованием 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>

- 3-я попытка была близкой, которая затеняла кнопки LinkButton, но не отключила возможность щелкать их Попытка 3 с помощью свойства «Включено»:

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

Некоторые другие мысли, которые у меня есть, включают использование события «OnClick» или «CommandArgument». Я попытался использовать 'OnClick' и в коде просто с помощью:

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

Любая помощь, мысли, идеи, примеры и т. Д. Будет принята с благодарностью. Спасибо всем заранее!

Скорректированный код:

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

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Вариант 3 и ваш последний подход, кажется, путь.Проблема с LinkButtons заключается в том, что даже если включить Enabled в false, вы не будете блокировать их отправку обратно.См .: http://weblogs.asp.net/jeffwids/archive/2011/02/14/how-to-disable-an-asp-net-linkbutton-when-clicked.aspx

Поэтому вы должны сделать это вручную с помощью:

lb.Attributes.Add("onclick", "this.href='#';this.disabled=true;" + Page.ClientScript.GetPostBackEventReference(lb, "").ToString());
0 голосов
/ 18 мая 2011

Polity, большое спасибо за вашу помощь, я действительно ценю это. Однако я нашел другой способ исправить эту проблему.

.ASPX Код:

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

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