Редактирование и сокрытие колонок в GridView

Unknown88

Доброго времени суток всем! На странице лежит GridView, которму присваивается DataSource из DataTable. Все отображается, все хорошо. Но теперь мне надо часть колонок скрыть, а часть - сделать редактируемыми. Как придумал сделать редактируемые колонки: конкретно их создаю вручную в виде TemplateField'ов, на которых лежит TextBox и больше ничего, а остальные колонки берутся через DataSource из DataTable - в результате нужные мне колонки можно править, остальные - нет. Все бы ничего, но теперь возникли следующие проблемы: 1) добавленные вручную колонки стоят на первом месте - их можно как-то сдвинуть? 2) добавленные вручную столбцы должны редактироваться только при определенном условии - пробовал подписываться на RowEditing и на лету смотреть, что редактируется, и отменять, если надо, но в моем случае это событие даже не происходит - как быть? 3) и, наконец, некоторые колонки надо спрятать - как это можно сделать?
21 ответ

Unknown88

Unknown88,Невидимость так , первые 2 пункта не осилил ....
.hidden
{	display<span>:</span><span> none</span><span>;</span>
}
<asp:BoundField <span>DataField</span><span>=</span><span>"FunctionName"</span> <span>HeaderText</span><span>=</span><span>"FunctionName"</span> <span>ReadOnly</span><span>=</span><span>"True"</span> <span>SortExpression</span><span>=</span><span>"FunctionName"</span>> <ControlStyle <span>CssClass</span><span>=</span><span>"hidden"</span> <span>/</span>> <FooterStyle <span>CssClass</span><span>=</span><span>"hidden"</span> <span>/</span>> <HeaderStyle <span>CssClass</span><span>=</span><span>"hidden"</span> <span>/</span>> <ItemStyle <span>CssClass</span><span>=</span><span>"hidden"</span> <span>/</span>> <<span>/</span>asp:BoundField>


Unknown88

Andrey1306, спасибо, но это не совсем то... Мне это нужно делать из кода, а не в разметке, т.к. сами колонки появляются только после присвоения DataSource'у каких-то данных.Хотяяя, конечно, можно забить на датасорс, а нафигачить нужное кол-во колонок вручную и в нужном порядке, и данные сливать тоже вручную - это решит 1 и 3 вопросы. Но хотелось бы все же другое решение.И еще раз спасибо за отклик! )


Unknown88

Unknown88,А что из кода так не выходит ?
Grid.Columns[1].Visible = false;
вдруг пригодится


Unknown88

Andrey1306,неа, ошибок не выдает, но и толку никакого (


Unknown88

а данные биндятся до того как вы с видимостью колонок играетесь?


Unknown88

Zoria,Сначала данные биндятся, затем уже пытаюсь спрятать колонку.До биндинга, я так понимаю, прятать еще нечего, т.к. колонки не созданы еще.И, кстати, попутный вопрос: как-то можно DataSource'у объяснить, што нужные колонки уже есть и новых создавать совсем не надо, а надо воспользоваться существующими? ))


Unknown88

Или по-другому: можно ли без DataSource'а добавить в таблицу строки?


Unknown88

Или по-другому: можно ли без DataSource'а добавить в таблицу строки?
http://msdn.microsoft.com/ru-ru/library/system.data.datatable.rows


Unknown88

SanSYS,имелся в виду GridView


Unknown88

SanSYS,имелся в виду GridView
Руки есть?


Unknown88

Unknown88,Или ты считаешь что данная тема настолько уникальна и с ней никто не сталкивался, что стоит подобные вопросы озвучивать на форумах?


Unknown88

Andrey1306,неа, ошибок не выдает, но и толку никакого (
Protected Sub GridView1_PreRender GridView1.Columns(1).Visible = False
End Sub


Unknown88

пачиму ево не зобанели?


Unknown88

1. Убрать автогенерацию;2. Самостоятельно в разметке указать нужные колонки, их тип, порядок, формат и т.п.Что за танцы?


Unknown88

1. Убрать автогенерацию;2. Самостоятельно в разметке указать нужные колонки, их тип, порядок, формат и т.п.Что за танцы?
Убрал автогенерацию, добавил нужные колонки в нужном порядке. Теперь как в грид запихнуть данные? Если через ДатаСорс, то ничего не происходит - такое впечатление складывается, што ДатаСорс вообще работает только при включенной автогенерации колонок. Ему (ДатаСорсу) можно как-то объяснить, што колонки есть и нужно использовать именно их? Или в обход ДатаСорса как-то можно залить данные?
Protected Sub GridView1_PreRender GridView1.Columns(1).Visible = False
End Sub
Спасибо, это вроде оно! ) Только вот такое ощущение, што в случае, если на формирование содержимого таблицы уходит значительное время, то код фэйлится - колонок не находит. Но это я еще почитаю очередность возникновения событий, спасибо еще раз!
пачиму ево не зобанели?
Можт просто не флудит? )


Unknown88

Убрал автогенерацию, добавил нужные колонки в нужном порядке. Теперь как в грид запихнуть данные? Если через ДатаСорс, то ничего не происходит - такое впечатление складывается, што ДатаСорс вообще работает только при включенной автогенерации колонок. Ему (ДатаСорсу) можно как-то объяснить, што колонки есть и нужно использовать именно их? Или в обход ДатаСорса как-то можно залить данные?
Ничего датасорсу не надо объяснять :) Код в студию!


Unknown88

skyANA,Да, был неправ )У колонок в разметке нужно выставить DataField - теперь их воспринимает ДатаСорс.Спасибо!


Unknown88

Но, естественно, на этом все не закончилось )Итого.Среди полей у меня имеются BoundField'ы и TemplateField'ы. Первые принимают данные из DataSource и успешно отображают их. TemplateField'ы же представляют из себя просто текстовое поле в ItemTemplate - таким образом они доступны для редактирования. Но если я теперь программно обращусь к ячейке из такого шаблонного поля (типа, GridView1.Rows[0].Cells[0]) и запихну в эту ячейку какой-либо текст, то этот текст появится в таблице, но ячейка перестанет быть редактируемой. И, собственно, событие редактирования отловить не могу.Кто-нибудь может объяснить, что именно происходит в приведенном мной примере и что сделать, чтобы избежать этих проблем?


Unknown88

Unknown88,пример
.... <asp:TemplateField <span>HeaderText</span><span>=</span><span>"CriteriaName"</span> <span>SortExpression</span><span>=</span><span>"CriteriaName"</span>> <ItemTemplate> <asp:Label <span>ID</span><span>=</span><span>"Label2"</span> <span>runat</span><span>=</span><span>"server"</span> <span>Width</span><span>=</span><span>"100%"</span> <span>Height</span><span>=</span><span>"100%"</span> <span>Text</span><span>=</span><span>'<%# Bind("CriteriaName") %>'</span>><<span>/</span>asp:Label> <<span>/</span>ItemTemplate> <EditItemTemplate> <asp:TextBox <span>ID</span><span>=</span><span>"TxtBoxCriteriaName"</span> <span>runat</span><span>=</span><span>"server"</span> <span>Rows</span><span>=</span><span>"12"</span> <span>Width</span><span>=</span><span>"100%"</span> <span>Height</span><span>=</span><span>"100%"</span> <span>Text</span><span>=</span><span>'<%# Bind("CriteriaName")%>'</span> <span>TextMode</span><span>=</span><span>"MultiLine"</span> ><<span>/</span>asp:TextBox> <asp:RequiredFieldValidator <span>ID</span><span>=</span><span>"RequiredFieldValidatorCriteriaName"</span> <span>runat</span><span>=</span><span>"server"</span> <span>ControlToValidate</span><span>=</span><span>"TxtBoxCriteriaName"</span> <span>ErrorMessage</span><span>=</span><span>"*"</span>><<span>/</span>asp:RequiredFieldValidator> <<span>/</span>EditItemTemplate> <ItemStyle <span>Width</span><span>=</span><span>"10%"</span> <span>HorizontalAlign</span><span>=</span><span>"Left"</span> <span>VerticalAlign</span><span>=</span><span>"Top"</span> <span>/</span>> <<span>/</span>asp:TemplateField>


Unknown88

Andrey1306,но это, я так понимаю, работает для случая, когда в таблице есть кнопочка "Edit", по нажатию на которою вся строка переходит в режим редактирования?Мне же не нужна кнопочка, мне нужно, чтобы несколько полей в нескольких (или пусть даже во всех) строках были всегда доступны для редактирования. Для этого я поместил в одного шаблонного поля текстовое поле. Но теперь я не могу считать введенное значение - не пойму, как достучаться до этого текстового поля.


Unknown88

Unknown88,тут