2013-08-01 3 views
2

У меня возникли проблемы с простой и простой задачей, которую я уже сделал миллион раз, но на этот раз я не могу.Невозможно изменить свойства LinkButtons в CodeBehind

меня LinkButtons в моей Gridview как

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:LinkButton ID="GVCon_TFEdit" runat="server" CssClass="eh_label_style" CommandArgument="Edit" CommandName="Edit" Text="Edit"></asp:LinkButton> 
    </ItemTemplate> 
</asp:TemplateField> 

И те, я шесть раз. Allways one Edit и один Delete-LinkButton.

Тогда я пытаюсь изменить видимый из них в CodeBehind в строке 5 (если я закомментировать, то на 6 и т.д.):

1 protected void Page_PreRenderComplete(object sender, EventArgs e) 
2   { 
3    if (Session["Permissions"].ToString() == "User") 
4    { 
5     GVComp_TFDelete.Visible = false; 
6     GVComp_TFEdit.Visible = false; 
7     GVCon_TFDelete.Visible = false; 
8     GVCon_TFEdit.Visible = false; 
9     GVMatr_TFDelete.Visible = false; 
10     GVMatr_TFEdit.Visible = false; 

Но ВСЕГДА приносит мне goodknown исключение:

Операция недопустима из-за текущего состояния объекта

Ну - я уверен, что объект разве нуль там больше?! (И сеанс [«Разрешения»] также не является нулевым, потому что он получает свой статус в PreLoad allready ...)

И, возможно, я должен рассказать вам больше, потому что у меня были проблемы с ТОЧНО этими LinkButtons bevore ^^ Итак - в этих TemplateFields у меня были те же LinkButtons, что и я изменил имя этих LB, и с тех пор я не мог использовать их в CodeBehind. Это было потому, что они больше не были в дизайнере ... Итак, я пробовал много советов, которые я нашел evrywhere in the inet, а также советы отсюда - но они не работали (как и восстановление файла конструктора, запись нового элемента LinkButtons в aspx- файл также я убедился, что файл находится в правой папке и т. д.). Ничего не получилось. Итак, я добавил их вручную в designer.cs. Теперь я могу «использовать» их в CodeBehind, но когда я начинаю отладку - она ​​сталкивается с этой ошибкой.

Было бы очень хорошо, если бы вы могли бы мне помочь, это так раздражает ...

+0

Btw скажите мне, если вам нужно больше кода! – DatRid

ответ

1

Поскольку вы используете Gridview, вы должны будете использовать событие RowDataBound для GridView.

И в этом случае вам необходимо будет проверить наличие e.Row.RowType == DataControlRowType.DataRow.

После этого, вы можете использовать

LinkButton lb = ((LinkButton)e.Row.FindControl("GVCon_TFEdit")); 

получить LinkButton для текущей строки, а затем использовать lb.Visible = false; или любой другой код, который нужно.

+0

Можно ли найти его также в GV.FindControl в PreRenderComplete? У меня есть RowDataBound allready, потому что я вставляю туда кое-что, поэтому это не проблема. Просто для interrest. – DatRid

+0

Теоретически вы можете перебирать все строки в gridview до тех пор, пока они связаны. – NoLifeKing

+0

Хорошо :) Но знаете ли вы, почему он удалил старый LB из файла designer.cs и не добавил новый, когда я его перестроил? Просто бонусный запрос, если вы этого не знаете, также хорошо: D – DatRid

2

Вы можете также найти с RowCommand события таким путем

LinkButton name = (LinkButton)gridview.Rows[index].FindControl("lnkbtnActionNames"); 

name.visible=false; 
+0

Да, но мне нужно было бы запустить RowCommand в первую очередь, и я не хочу, чтобы любой пользователь (только админы) имел те LinkButtons, у которых был бы RowCommand. – DatRid

Смежные вопросы