Получить скрытое значение поля - PullRequest
5 голосов
/ 02 декабря 2009

У меня GridView определено следующим образом:

<asp:GridView ID="myGridView" AutoGenerateColumns="false" runat="server"
OnLoad="myGridView_Load" OnRowCommand="myGridView_Command" OnRowEditing="myGridView_RowEditing" OnRowDeleting="myGridView_RowDeleting" DataKeyNames="ID" > 
  <Columns>
    <asp:BoundField DataField="ID" Visible="false" />
    <asp:BoundField DataField="BirthDate" Visible="false" />
    <asp:BoundField DataField="FirstName" HeaderText="First Name" />
    <asp:BoundField DataField="LastName" HeaderText="Last Name" />
    <asp:TemplateField HeaderText="Other">
      <ItemTemplate>
        <asp:LinkButton ID="editLB" runat="server" Text="edit" CommandName="Edit" />
        <asp:LinkButton ID="deleteLB" runat="server" Text="delete" CommandName="Delete" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>   
</asp:GridView>

Когда пользователь нажимает кнопку редактирования, мне нужно получить значение столбца BirthDate. Чтобы попытаться это сделать, я попробовал следующее:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
  GridViewRow row = gvUsers.Rows[e.NewEditIndex];
  DateTime birthDate = (DateTime)(row.Cells[1].Text);

  // Does not work
}

Я знаю, что это как-то связано с тем, что столбец не виден. Столбец должен быть скрыт. Но мне нужно получить это значение & mdash; как я могу это сделать?

Ответы [ 6 ]

9 голосов
/ 02 декабря 2009

Проблема в том, что когда для свойства Visibility BoundField установлено значение false, столбец не отображается клиенту. Обходной путь - использовать HiddenField внутри TemplateField.

<asp:TemplateField>
    <ItemTemplate>
        <asp:HiddenField ID="HiddenField1" runat="server" 
                         Value='<%# Eval("BirthDate") %>' />
    </ItemTemplate>
    <EditItemTemplate>
        <asp:HiddenField ID="HiddenField1" runat="server" 
                         Value='<%# Eval("BirthDate") %>' />
    </EditItemTemplate>
</asp:TemplateField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridViewRow row = GridView.Rows[e.NewEditIndex];     
    HiddenField  hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1");
    DateTime birthDate = Convert.ToDateTime(hidden.Value);
}

EDIT

Приведенный выше метод по-прежнему отображает столбец в таблице, поэтому в итоге получается пустой столбец. Это работает, но не лучшее решение, вот способ скрыть поле BirthDate, но все же получить его значение в обработчике RowEditing. Просто имейте в виду, что Дата рождения все еще отображается клиенту, но не отображается.

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

<asp:BoundField DataField="BirthDate">
    <ItemStyle CssClass="hide"/>
</asp:BoundField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridViewRow row = GridView1.Rows[e.NewEditIndex];
    DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text);
}
5 голосов
/ 04 апреля 2013

Чтобы скрыть содержимое, а также заголовок в сетке, используйте следующий код: и получить доступ к колонке, как обычно. GridView.SelectedRow.Cells[index].Text;

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

<asp:BoundField DataField="MailRoomID" HeaderText="Mailroom ID" ItemStyle-HorizontalAlign="Center" ShowHeader="false" ><ItemStyle CssClass="hide" /><HeaderStyle CssClass="hide"/></asp:BoundField>
2 голосов
/ 02 декабря 2009

Я сделал что-то вроде этого (адаптируясь к вашему примеру):

string[] keyList = new string[1];   
keyList[0] = "BirthDate";  
myGridView.DataKeyNames = keyList;

Затем я связал GridView с таблицей данных, в которой есть столбец с именем «Дата рождения». Данные в этом столбце будут храниться под указанным выше DataKeyName.

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

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)  
{   
  DataKeyArray keyList = myGridView.DataKeys as DataKeyArray;
  if (keyList != null)       
    DateTime birthDate = keyList[e.NewEditIndex];    
}

Однако я понимаю, что это не касается скрытых полей.

1 голос
/ 02 декабря 2009

Ознакомьтесь со следующей статьей, в которой показано, как получить доступ к невидимым столбцам GridView:

http://www.highoncoding.com/Articles/178_Access_GridView_Invisible_Columns.aspx

Идея состоит в том, чтобы в основном использовать столбец TemplateField вместо BoundColumn.

0 голосов
/ 02 декабря 2009

Я бы использовал предложение о скрытом поле, которое предложил Федрус, а затем в вашем коде; используйте что-то вроде этого:

GridViewRow row = gvUsers.Rows[e.NewEditIndex];
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate");
DateTime birthDate = DateTime.Parse(hfBirthDate.Value);
0 голосов
/ 02 декабря 2009

это один из способов получения данных из базовых данных

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
  GridViewRow row = gvUsers.Rows[e.NewEditIndex];
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...