Элемент управления DataGrid отключен - PullRequest
2 голосов
/ 11 марта 2009

У меня есть DataGrid в ASP.NET 2.0 со следующим столбцом:

<ASP:TEMPLATECOLUMN>
    <ItemStyle HorizontalAlign="Right"></ItemStyle>         
    <ItemTemplate>
        <asp:HyperLink id="HyperLink1" runat="server" 
            CssClass="DataGridCommand" Target="_blank"
            NavigateUrl='<%# GetPreviewURL(DataBinder.Eval(Container, "DataItem.NodeID")) %>'>
        Preview Graphic
        </asp:HyperLink>
    </ItemTemplate>
</ASP:TEMPLATECOLUMN>   

Таким образом, основная идея состоит в том, чтобы в каждой строке DataGrid была ссылка, которая возвращает всплывающий предварительный просмотр изображения (ссылаясь на столбец с привязкой к данным для NodeID). Это работает просто отлично.

Я пытаюсь отключить ссылки для строк, для которых нет связанного изображения. Для этого я поместил это в код позади Page_Load:

foreach (DataGridItem dgi in this.dgNode.Items)
{
    HyperLink myLink1 = (HyperLink)dgi.Cells[0].FindControl("HyperLink1");

    //myLink1.Visible = false;
    //if (condition for hiding links goes here...)
    myLink1.Enabled = false;
    this.dgNode.DataBind();
}

Как видите, я попытался установить для свойства visible значение false, но это не сработало. Я попытался установить enable на false, это тоже не сработало. А потом я снова попытался связать данные с DataGrid - не работает. Ссылки продолжают нормально функционировать.

Кто-нибудь знает, почему это не работает, что можно сделать, чтобы заставить его работать, и, если оно в корне ошибочно, альтернативное решение? Я хочу либо скрыть ссылку для определенных строк, либо скрыть ее, чтобы ее нельзя было щелкнуть.

Ответы [ 4 ]

2 голосов
/ 11 марта 2009

Вы можете справиться с этим в событии OnRowDataBound , например:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1");
    hl.Visible = false;
}
1 голос
/ 11 марта 2009

Вместо зацикливания элементов при загрузке страницы вы должны добавить обработчик событий для обработки события OnItemDataBound. Затем вы можете найти и отключить гиперссылку там, когда каждый элемент связан.

Я считаю, что текущее решение не работает, потому что оно вызывает метод DataBind () после установки ссылки на невидимое или отключенное. Это заставит DataGrid перестраивать себя и стирает работу, которую вы только что сделали. Не говоря уже о том, что вы перепривязываете свою DataGrid для каждого элемента, что снижает производительность.

1 голос
/ 11 марта 2009

Держу пари, что, поскольку вы отключаете гиперссылки, а затем связываете сетку данных после того факта, что повторное связывание, по сути, снова «активирует» ссылки через код привязки данных.

В качестве альтернативы задумывались ли вы о том, чтобы использовать событие ItemDatabound DataGrid и включить / отключить гиперссылки в это время? Все данные будут у вас под рукой, и код будет выглядеть примерно так же, как и сейчас.

0 голосов
/ 11 марта 2009

Я не уверен, но я думаю, что asp.net торопится, потому что у вас есть более одного экземпляра объекта Hyperlink1. Is not Свойство ID используется как уникальный идентификатор, если существует более одного экземпляра, возможно, он отказывается им манипулировать.

...