Управление DataGrid отключено

У меня есть 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 - не работает. Ссылки продолжают нормально работать.

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


person n2009    schedule 11.03.2009    source источник


Ответы (4)


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

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1");
    hl.Visible = false;
}
person Chris Van Opstal    schedule 11.03.2009

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

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

person sgriffinusa    schedule 11.03.2009

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

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

person Dillie-O    schedule 11.03.2009

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

person Erick    schedule 11.03.2009