Як приховати стовпець (GridView), але все одно отримати доступ до його значення?


78

У мене є GridView з DataSource(база даних SQL). Я хочу сховати стовпець, але все одно матиму доступ до значення, коли виберу запис. Хтось може показати мені, як це зробити?

Це стовпець, який я хочу приховати, і все ще хочу отримати доступ до його значення:

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

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

Відповіді:


44

Якщо я не помиляюся, GridViewне містить значень, BoundColumnsякі мають атрибут visible="false". Тут ви можете зробити дві речі, одну (як пояснюється у відповіді від V4Vendetta) для використання Datakeys. Або ви можете змінити свій BoundColumnна a TemplateField. А в ItemTemplateдодайте елемент керування типу Label, зробіть його видимість хибним і надайте цьому значення Label.


6
Це приховує стовпець, але не приховує заголовок стовпця. Як ти це зробиш?
Аполлон,

2
Просто додайте <HeaderStyle CssClass = "hidden" /> у ваше поле прив'язки. І визначте стиль css таким: .hidden {display: none; }
Філіпп

85
<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);
}

Для детального пояснення цього рішення див. Netomatix.com/development/GridViewHideColumn.aspx .
Марсель

2
Це рішення має додаткову перевагу в тому, що дані все ще доступні в javascript і на стороні клієнта. Має бути найкращим рішенням цієї проблеми!
Шон Кеон

42

Визначте стиль у css:

.hiddencol { display: none; }

Потім додайте атрибут ItemStyle-CssClass="hiddencol"and у HeaderStyle-CssClass="hiddencol"поле сітки:

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

Це набагато ефективніша відповідь
ImCrimson

36

Ви можете використовувати DataKeys для отримання значення таких полів, оскільки (як ви вже сказали), коли ви встановлюєте нормальне значення BoundFieldяк видиме хибне, ви не можете отримати їх значення.

У .aspxфайлі встановіть GridViewвластивість

DataKeyNames = "Outlook_ID"

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

grid.DataKeys[rowIndex]["Outlook_ID"]

Це дасть вам ідентифікатор у вказаному рядковому індексі сітки.


1
DataKeys, де для цього призначено
Антуан Пеллетьє

Як би це працювало, якби ви використовували елементи керування DataSource із CRUD-кодом у HTML ...?
Hannington Mambo,

23

Ви можете зробити це програмно:

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

Таким чином ви встановлюєте стовпець видимим перед прив'язкою даних, тому стовпець генерується. Якщо ви встановили стовпець як невидимий, тому він не відображається.


1
Не працюючи взагалі, я отримую ArrayOutOfBoundsException, коли розміщую цей код у методі Panel PreRender.
Чекспір

2
Працював у мене просто і легко.
RustyH

Це, безумовно, найкраща відповідь.
Талха Імам

11

Якщо у вас TemplateFieldвсередині стовпців вашого, GridViewі у вас є, скажімо, елемент керування з ім'ям blah, прив'язаний до нього. Потім помістіть outlook_idяк a 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;

Поверніться, якщо у вас виникли проблеми з доступом до натиснутого рядка. І не забудьте згадати подію, на якій ви хотіли б отримати до цього доступ.


9

Ви можете зробити стовпець 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;
    }
}

Це працює. Для всіх, хто шукає, потрібно переконатися, що як стовпець заголовка, так і стовпець сітчастого вікна приховані.
Danrex

4

Залиште видимі стовпці перед заповненням GridView. Заповніть, GridViewа потім сховайте стовпці.


2

Ось як отримати значення прихованого стовпця в, GridViewякому встановлено значення Visible=False: додати поле даних у цьому випадку SpecialInstructionsдо властивості DataKeyNames зв’язаного GridView і отримати доступ до нього таким чином.

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

Ось і все, працює щоразу дуже просто.


2

У мене є нове рішення приховати колонку на стороні клієнта з допомогою CSS або JavaScript або JQuery .

.col0
{
  display: none;
}

А у файлі aspx, куди ви додаєте стовпець, слід вказати властивості CSS:

<asp:BoundField HeaderText="Address Key" DataField="Address_Id" ItemStyle-CssClass="col0" HeaderStyle-CssClass="col0" > </asp:BoundField>

1

Я використав метод, подібний до user496892:

SPBoundField hiddenField = new SPBoundField();
hiddenField.HeaderText = "Header";
hiddenField.DataField = "DataFieldName";
grid.Columns.Add(hiddenField);

grid.DataSource = myDataSource;
grid.DataBind();

hiddenField.Visible = false;

0

Ви можете зробити це кодом позаду.

Set visible= falseдля стовпців після прив'язки даних. Після цього ви можете знову зробити видимість " true " у функції row_selection у поданні сітки. Це спрацює !!


0

Коли я хочу отримати доступ, з'являється якесь значення від GridViewраніше GridView.

  1. У мене є BoundFieldі прив'язка DataFieldномінально.
  2. У RowDataBoundразі, я який - то процес в цьому випадку.
  3. Раніше GridView з'явиться, я пишу це:

    protected void GridviewLecturer_PreRender(object sender, EventArgs e) 
    {
        GridviewLecturer.Columns[0].Visible = false;
    }
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.