2013-07-01 2 views
7

У меня есть вид сетки, и я, используя различные данные: однакоСкрыть BoundField, но все еще быть в состоянии получить значения с C#

<asp:BoundField DataField="Catagory" HeaderText="Support Catagory" SortExpression="Catagory" /> 
<asp:BoundField DataField="AppName" HeaderText="Application Name" SortExpression="IncidentNumber" /> 
<asp:BoundField DataField="IncidentNumber" HeaderText="Incident #" SortExpression="IncidentNumber" /> 
<asp:BoundField DataField="Hours" HeaderText="Hours" SortExpression="Hours" /> 
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" /> 
<asp:BoundField DataField="CreatedDate" HeaderText="Created Date" SortExpression="CreatedDate" /> 
<asp:BoundField DataField="PK_DailyTaskHours" HeaderText="" SortExpression="PK_DailyTaskHours" ReadOnly="true" /> 
<asp:BoundField DataField="PK_NonScrumStory" HeaderText="" SortExpression="PK_NonScrumStory" ReadOnly="true" /> 

Последние две колонки Я не хочу, чтобы показать, я использую так что я могу получить первичные ключи с этим C# код:

string dailyTaskHoursPK = (string)e.Values["PK_DailyTaskHours"].ToString(); 
    string nonScrumStoryPK = (string)e.Values["PK_NonScrumStory"].ToString(); 
    SqlDataSource4.DeleteParameters["dailyTaskHoursPK"].DefaultValue = dailyTaskHoursPK; 
    SqlDataSource4.DeleteParameters["nonScrumStoryPK"].DefaultValue = nonScrumStoryPK; 

Однако, я не хочу, чтобы отобразить последние два столбца. Но когда я установил:

Visible="false" 

И попробуйте запустить программу, я получаю следующее сообщение об ошибке:

ссылка на объект не указывает на экземпляр объекта.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.NullReferenceException: Ссылка на объект не установлена ​​в экземпляр объекта.

Что я делаю неправильно? Как запретить пользователям просматривать эти поля?

ответ

6

Trevor правильно, вы должны установить DataKeyNames, как это в вашем DataGrid разметке:

<asp:GridView ID="GridView1" runat="server" 
     DataKeyNames="PK_DailyTaskHours,PK_NonScrumStory" 

После того, как вы сделали это, вы можете получить значения обратно в виде строки, как это:

 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     string dailyTaskHoursPK = GridView1.DataKeys[0].Values["PK_DailyTaskHours"].ToString(); 
     string nonScrumStoryPK = GridView1.DataKeys[0].Values["PK_NonScrumStory"].ToString(); 
    } 
3

Вы также должны установить свойство DataKeyNames элемента управления, привязанного к данным. Установка видимости на false приведет к тому, что поля не будут отправляться клиенту, если поле не указано в свойстве DataKeyNames. См. Страницу msdn на странице DataControlField.Visible Property.

+0

Не могли бы вы рассказать о свойстве DataKeyNames? Я не совсем понимаю, что вы имеете ввиду. –

5

Постарайтесь, чтобы они были видимыми = "true", но спрячьте их с помощью css.

<style type="text/css"> 
.hidden-field 
{ 
    display:none; 
} 
</style> 

... 
<asp:BoundField DataField="PK_DailyTaskHours" HeaderText="" SortExpression="PK_DailyTaskHours" ReadOnly="true" > 
    <ItemStyle CssClass="hidden-field"/> 
</asp:BoundField> 
<asp:BoundField DataField="PK_NonScrumStory" HeaderText="" SortExpression="PK_NonScrumStory" ReadOnly="true" > 
    <ItemStyle CssClass="hidden-field"/> 
</asp:BoundField> 
+1

Это удаляет текст из ящиков, но ячейки все еще можно увидеть. –

+0

Да, я согласен, моя работа будет работать, но ваше решение было лучше. –

+0

Этот подход работал для меня - мне просто пришлось применить класс как к ItemStyle, так и к HeaderStyle. (И мне нужно получить доступ к значениям на стороне клиента, а не на стороне сервера.) – wloescher

1

Если вы хотите, чтобы скрыть столбец, а также получить его значение, необходимо указать DataKeyNames свойство для GridView в ASPX странице.

<asp:GridView ID="GridView1" runat="server" DataKeyNames="PK_DailyTaskHours" ...> 

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

string showId = (string) GridView1.DataKeys[6].Value.ToString(); 
1

над кодом скрыть значение BoundField, но не скрыть заголовок и пропустить совпадение со всеми столбцами, поэтому я немного изменю

<style type="text/css"> 
     .hidden-field 
     { 
      display:none; 
     } 
    </style> 

...

<asp:BoundField DataField="PK_NonScrumStory" HeaderText="" SortExpression="PK_NonScrumStory" ReadOnly="true" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" > 
</asp:BoundField> 

теперь это правильной работы

+0

Единственное работающее решение для меня! Большое спасибо! –

0

попробовать использовать логически, используя размер шрифта

например

grid.Columns[0].HeaderStyle.Font.Size = grid.Columns[0].ItemStyle.Font.Size = 0; 
Смежные вопросы