Как скрыть столбец (GridView), но при этом получить доступ к его значению? - PullRequest
68 голосов
/ 21 марта 2011

У меня есть GridView с DataSource (база данных SQL). Я хочу скрыть столбец, но все же смогу получить доступ к значению при выборе записи. Может кто-нибудь показать мне, как это сделать?

Это столбец, который я хочу скрыть и по-прежнему хочу получить доступ к его значению:

<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />

Я пытался все, чтобы скрыть столбец (свойство Visible="false"), но не могу получить доступ к его значению.

Ответы [ 13 ]

77 голосов
/ 21 мая 2012
<head runat="server">
<title>Accessing GridView Hidden Column value </title>
<style type="text/css">
  .hiddencol
  {
    display: none;
  }
</style>

<asp:BoundField HeaderText="Email ID" DataField="EmailId" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >
</asp:BoundField>

ArrayList EmailList = new ArrayList();
foreach (GridViewRow itemrow in gvEmployeeDetails.Rows)
{
  EmailList.Add(itemrow.Cells[YourIndex].Text);
}
44 голосов
/ 21 марта 2011

Если я не ошибаюсь, GridView не содержит значений BoundColumns, которые имеют атрибут visible="false".Здесь вы можете сделать две вещи: одну (как объяснено в ответе от V4Vendetta) использовать Datakeys.Или вы можете изменить BoundColumn на TemplateField.А в ItemTemplate добавьте элемент управления, например Label, сделайте его видимость ложной и присвойте ему значение Label.

39 голосов
/ 10 ноября 2012

Определите стиль в css:

.hiddencol { display: none; }

Затем добавьте атрибут ItemStyle-CssClass="hiddencol" и HeaderStyle-CssClass="hiddencol" в поле сетки:

<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol"  HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />
31 голосов
/ 21 марта 2011

Вы можете использовать DataKeys для получения значения таких полей, потому что (как вы сказали), когда вы устанавливаете нормальное BoundField в качестве видимого false, вы не можете получить их значение.

В файле .aspx установить свойство GridView

DataKeyNames = "Outlook_ID"

Теперь в обработчике событий вы можете получить доступ к значению этого ключа следующим образом:

grid.DataKeys[rowIndex]["Outlook_ID"]

Это даст вам идентификатор по указанному индексу строки сетки.

20 голосов
/ 11 ноября 2011

Вы можете сделать это программно:

grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;

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

10 голосов
/ 21 марта 2011

Если у вас есть TemplateField внутри столбцов вашего GridView, и у вас есть, скажем, элемент управления по имени бла, связанный с ним.Затем поместите outlook_id как HiddenField там следующим образом:

<asp:TemplateField HeaderText="OutlookID">
    <ItemTemplate>
        <asp:Label ID="blah" runat="server">Existing Control</asp:Label>
        <asp:HiddenField ID="HiddenOutlookID" runat="server" Value='<%#Eval("Outlook_ID") %>'/>
    </ItemTemplate>
</asp:TemplateField>

Теперь возьмите строку в том случае, если вы хотите outlook_id, а затем получите доступ к элементу управления.
Для RowDataBound получить доступ к нему, как:

string outlookid = ((HiddenField)e.Row.FindControl("HiddenOutlookID")).Value;

Вернитесь, если у вас возникли проблемы с доступом к нажатой строке.И не забудьте упомянуть событие, на котором вы хотели бы получить к нему доступ.

8 голосов
/ 20 апреля 2012

Вы можете сделать столбец hidden на стороне сервера, и по какой-то причине это отличается от кода aspx. На него все еще можно ссылаться, как если бы оно было видимым. Просто добавьте этот код в ваше OnDataBound событие.

protected void gvSearchResults_DataBound(object sender, EventArgs e)
{
    GridView gridView = (GridView)sender;

    if (gridView.HeaderRow != null && gridView.HeaderRow.Cells.Count > 0)
    {
        gridView.HeaderRow.Cells[UserIdColumnIndex].Visible = false;
    }

    foreach (GridViewRow row in gvSearchResults.Rows)
    {
        row.Cells[UserIdColumnIndex].Visible = false;
    }
}
4 голосов
/ 12 октября 2011

Оставьте видимые столбцы перед заполнением GridView. Заполните GridView и затем скройте столбцы.

2 голосов
/ 27 апреля 2015

Вот как получить значение скрытого столбца в GridView, установленном в Visible=False: добавить поле данных в этом случае SpecialInstructions в свойство DataKeyNames связанного GridView и получить к нему доступ:путь.

txtSpcInst.Text = GridView2.DataKeys(GridView2.SelectedIndex).Values("SpecialInstructions")

Вот и все, каждый раз работает очень просто.

2 голосов
/ 16 февраля 2015

У меня есть новое решение скрыть столбец на стороне клиента, используя css или javascript или jquery .

.col0
{
  display: none;
}

И установитеgvClientDetails.Columns[0].Visible = true;, если вы установите false.

...