Як приховати стовпець (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.