Подтвердить что ты не робот

GridView Скрыть колонку по коду

Я хочу скрыть столбец ID в моем GridView, я знал код

GridView1.Columns[0].Visible = false;

но неожиданность заключалась в том, что мое свойство count для моих столбцов GridView равно 0!!! в то время как я вижу данные в GridView, поэтому любые идеи?

Спасибо,

Update:

вот полный код метода, который заполняет GridView

public DataSet GetAllPatients()
{
    SqlConnection connection = new SqlConnection(this.ConnectionString);

    String sql = "SELECT [ID],[Name],[Age],[Phone],[MedicalHistory],[Medication],[Diagnoses] FROM [dbo].[AwadyClinc_PatientTbl]order by ID desc";

    SqlCommand command = new SqlCommand(sql, connection);

    SqlDataAdapter da = new SqlDataAdapter(command);

    DataSet ds = new DataSet();

    da.Fill(ds);

    return ds;

}
4b9b3361

Ответ 1

GridView.Columns.Count всегда будет 0, если ваш GridView имеет свойство AutoGenerateColumns, установленное на true (по умолчанию - true).

Вы можете явно объявить свои столбцы и установить свойство AutoGenerateColumns на false, или вы можете использовать это в своем коде:

GridView.Rows[0].Cells.Count

чтобы получить счетчик столбцов, как только данные GridView были связаны, или это:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[index].Visible = false;
}

чтобы установить невидимый столбец, используя событие GridView RowDataBound.

Ответ 2

Это помогло мне

this.myGridview.Columns[0].Visible = false;

Здесь 0 - индекс столбца, который я хочу скрыть.

Ответ 3

Вы можете скрыть определенный столбец, запросив коллекцию данных datacontrolfield для нужного текста заголовка столбца и установив его видимость в true.

((DataControlField)gridView.Columns
               .Cast<DataControlField>()
               .Where(fld => (fld.HeaderText == "Title"))
               .SingleOrDefault()).Visible = false;

Ответ 4

Некоторые из ответов, которые я видел, объясняют, как сделать содержимое ячейки невидимым, но не как скрыть весь столбец, и это то, что я хотел сделать.

Если у вас есть AutoGenerateColumns = "false" и на самом деле используется BoundField для столбца, который вы хотите скрыть, Bala answer является гладким. Но если вы используете TemplateField для столбца, вы можете обработать событие DataBound и сделать что-то вроде этого:

protected void gridView_DataBound(object sender, EventArgs e)
{
    const int countriesColumnIndex = 4;

    if (someCondition == true)
    {
        // Hide the Countries column
        this.gridView.Columns[countriesColumnIndex].Visible = false;
    }
}

Возможно, это не то, что искали OP, но это решение, которое я искал, когда я задал тот же вопрос.

Ответ 5

Если вы хотите скрыть этот столбец при заполнении сетки, вы можете сделать это как можно скорее на странице aspx

<asp:BoundField DataField="test" HeaderText="test" Visible="False" />

Ответ 6

Здесь я связываю gridview с набором данных, подобным этому -

GVAnswer.DataSource = DS.Tables[0];
GVAnswer.DataBind();

Затем после

Затем мы подсчитываем количество строк как это в цикле for

for (int i = 0; i < GVAnswer.Rows.Count; i++)
{

}

Затем после того, как мы найдем заголовок, мы хотим сделать видимым false

GVAnswer.HeaderRow.Cells[2].Visible = false;

после того как мы сделаем видимость ложной для этой конкретной ячейки.

Полный код указан как

public void FillGVAnswer(int QuestionID)
{
    try
    {


        OBJClsQuestionAnswer = new ClsQuestionAnswer();
        DS = new DataSet();
        DS = OBJClsQuestionAnswer.GetAnswers(QuestionID);

        GVAnswer.DataSource = DS.Tables[0];
        GVAnswer.DataBind();
        if (DS.Tables[0].Rows.Count > 0)
        {



            for (int i = 0; i < GVAnswer.Rows.Count; i++)
            {

                GVAnswer.HeaderRow.Cells[2].Visible = false;
                GVAnswer.HeaderRow.Cells[3].Visible = false;
                GVAnswer.HeaderRow.Cells[6].Visible = false;

                GVAnswer.HeaderRow.Cells[8].Visible = false;

                GVAnswer.HeaderRow.Cells[10].Visible = false;

                GVAnswer.HeaderRow.Cells[11].Visible = false;


                //GVAnswer.Rows[i].Cells[1].Visible = false;
                if (GVAnswer.Rows[i].Cells[4].Text == "T")
                {
                    GVAnswer.Rows[i].Cells[4].Text = "Text";
                }
                else
                {
                    GVAnswer.Rows[i].Cells[4].Text = "Image";
                }
                if (GVAnswer.Rows[i].Cells[5].Text == "View Image")
                {
                    HtmlAnchor a = new HtmlAnchor();
                    a.HRef = "~/ImageHandler.aspx?ACT=AIMG&AID=" + GVAnswer.Rows[i].Cells[2].Text;
                    a.Attributes.Add("rel", "lightbox");
                    a.InnerText = GVAnswer.Rows[i].Cells[5].Text;

                    GVAnswer.Rows[i].Cells[5].Controls.Add(a);
                }

                if (GVAnswer.Rows[i].Cells[7].Text == "Yes")
                {
                    j++;
                    ViewState["CheckHasMulAns"] = j;// To Chek How Many answer Of a particulaer Question Is Right
                }

                GVAnswer.Rows[i].Cells[8].Visible = false;
                GVAnswer.Rows[i].Cells[3].Visible = false;
                GVAnswer.Rows[i].Cells[10].Visible = false;
                GVAnswer.Rows[i].Cells[6].Visible = false;
                GVAnswer.Rows[i].Cells[11].Visible = false;
                GVAnswer.Rows[i].Cells[2].Visible = false;

            }
        }
    }
    catch (Exception ex)
    {
        string err = ex.Message;
        if (ex.InnerException != null)
        {
            err = err + " :: Inner Exception :- " + ex.InnerException.Message;
        }
        string addInfo = "Error in getting Answers :: -> ";
        ClsExceptionPublisher objPub = new ClsExceptionPublisher();
        objPub.Publish(err, addInfo);
    }
}

Ответ 7

Если вы хотите скрыть столбец по его имени, а не его индекс в GridView. После создания DataTable или Dataset вам нужно найти индекс столбца по его имени, а затем сохранить индекс в глобальной переменной, такой как ViewStae, Session и т.д., А затем вызвать его в RowDataBound, например, пример:

string headerName = "Id";
        DataTable dt = .... ;

        for (int i=0;i<dt.Columns.Count;i++)
        {
            if (dt.Columns[i].ColumnName == headerName)
            {
                ViewState["CellIndex"] = i;

            }

        }

  ... GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{

    if (e.Row.RowType == DataControlRowType.Header || e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer)
    {

        int index = Convert.ToInt32(ViewState["CellIndex"]);

        e.Row.Cells[index].Visible = false;
    }                        
}

Ответ 8

 private void Registration_Load(object sender, EventArgs e)
    {

                        //hiding data grid view coloumn
                        datagridview1.AutoGenerateColumns = true;
                            datagridview1.DataSource =dataSet;
                            datagridview1.DataMember = "users"; //  users is table name
                            datagridview1.Columns[0].Visible = false;//hiding 1st coloumn coloumn
                            datagridview1.Columns[2].Visible = false; hiding 2nd coloumn
                            datagridview1.Columns[3].Visible = false; hiding 3rd coloumn
                        //end of hiding datagrid view coloumns

        }


    }

Ответ 9

То, что большинство ответов здесь не объясняет, - что, если вам нужно сделать столбцы видимыми снова и невидимыми, все на основе данных динамически? В конце концов, не должен ли GridViews быть ориентированным на данные?

Что делать, если вы хотите включать или выключать столбцы на основе ваших данных?

Мой Gridview

<asp:GridView ID="gvLocationBoard" runat="server" AllowPaging="True" AllowSorting="True" ShowFooter="false" ShowHeader="true" Visible="true" AutoGenerateColumns="false" CellPadding="4" ForeColor="#333333" GridLines="None"
            DataSourceID="sdsLocationBoard" OnDataBound="gvLocationBoard_DataBound" OnRowDataBound="gvLocationBoard_RowDataBound" PageSize="15" OnPreRender="gvLocationBoard_PreRender">
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <Columns>
                <asp:TemplateField HeaderText="StudentID" SortExpression="StudentID" Visible="False">
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("StudentID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Student" SortExpression="StudentName">
                    <ItemTemplate>
                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("StudentName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Status" SortExpression="CheckStatusName" ItemStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                        <asp:HiddenField ID="hfStatusID" runat="server" Value='<%# Eval("CheckStatusID") %>' />
                        <asp:Label ID="Label4" runat="server" Text='<%# Eval("CheckStatusName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="RollCallPeriod0" Visible="False">
                    <ItemTemplate>
                        <asp:CheckBox ID="cbRollCallPeriod0" runat="server" />
                        <asp:HiddenField ID="hfRollCallPeriod0" runat="server" Value='<%# Eval("RollCallPeriod") %>' />
                    </ItemTemplate>
                    <HeaderStyle Font-Size="Small" />
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="RollCallPeriod1" Visible="False">
                    <ItemTemplate>
                        <asp:CheckBox ID="cbRollCallPeriod1" runat="server" />
                        <asp:HiddenField ID="hfRollCallPeriod1" runat="server" Value='<%# Eval("RollCallPeriod") %>' />
                    </ItemTemplate>
                    <HeaderStyle Font-Size="Small" />
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
        ..
etc..

Обратите внимание на "RollCallPeriodn", где "n" - порядковый номер.

То, как я это делаю, - это дизайн скрывать все столбцы, которые, как я знаю, будут включены (видимые = "истинные" ) или OFF (видимые = "ложные" ) позже, и в зависимости от моих данных.

В моем случае я хочу отображать Period Times до определенного столбца. Например, если сегодня 9 утра, я хочу показывать периоды 6am, 7am, 8am и 9am, , но не 10am, 11am и т.д.

В другие дни я хочу показать ВСЕ время. И так далее.

Итак, как мы это делаем?

Почему бы не использовать PreRender в "reset" Gridview?

protected void gvLocationBoard_PreRender(object sender, EventArgs e)
{
    GridView gv = (GridView)sender;
    int wsPos = 3;
    for (int wsCol = 0; wsCol < 19; wsCol++)
    {
        gv.Columns[wsCol + wsPos].HeaderText = "RollCallPeriod" + wsCol.ToString("{0,00}");
        gv.Columns[wsCol + wsPos].Visible = false;
    }
}

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

  protected void gvLocationBoard_DataBound(object sender, EventArgs e)
    {
        //Show the headers for the Period Times directly from sdsRollCallPeriods
        DataSourceSelectArguments dss = new DataSourceSelectArguments();
        DataView dv = sdsRollCallPeriods.Select(dss) as DataView;
        DataTable dt = dv.ToTable() as DataTable;
        if (dt != null)
        {
            int wsPos = 0;
            int wsCol = 3;  //start of PeriodTimes column in gvLocationBoard
            foreach (DataRow dr in dt.Rows)
            {
                gvLocationBoard.Columns[wsCol + wsPos].HeaderText = dr.ItemArray[1].ToString();
                gvLocationBoard.Columns[wsCol + wsPos].Visible = !gvLocationBoard.Columns[wsCol + wsPos].HeaderText.StartsWith("RollCallPeriod");

                wsPos += 1;
            }
        }
    }

Я не буду раскрывать SqlDataSource здесь, но достаточно сказать с помощью PreRender, я могу reset my Gridview и включить колонки, которые я хочу, с нужными заголовками.

Таким образом, он работает так, что каждый раз, когда вы выбираете другую дату или время для отображения в качестве заголовков, он сбрасывает GridView в текст заголовка по умолчанию и статус Visible = "false", прежде чем он снова построит Gridview. В противном случае, без PreRender, GridView будет иметь предыдущие заголовки данных, поскольку код затирает настройки по умолчанию.

Ответ 10

Пожалуйста, используйте этот код. Это делает невидимый столбец, если пустым...

    protected void gridview1_DataBound(object sender, EventArgs e)
    {
        Boolean hasData = false;
        for (int col = 0; col < gridview1.HeaderRow.Cells.Count; col++)
        {
            for (int row = 0; row < gridview1.Rows.Count; row++)
            {
                if (!String.IsNullOrEmpty(gridview1.Rows[row].Cells[col].Text)
                    && !String.IsNullOrEmpty(HttpUtility.HtmlDecode(gridview1.Rows[row].Cells[col].Text).Trim()))
                {
                    hasData = true;
                    break;
                }
            }

            if (!hasData)
            {
                gridview1.HeaderRow.Cells[col].Visible = false;
                for (int hiddenrows = 0; hiddenrows < gridview1.Rows.Count; hiddenrows++)
                {
                    gridview1.Rows[hiddenrows].Cells[col].Visible = false;
                }
            }

            hasData = false;

        }

    }

Ответ 11

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

Ответ 12

Это был код, который работал у меня, когда идентификатор столбца неизвестен, а AutoGenerateColumns == true;

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<html>
<head runat="server">
    <script runat="server">
        protected void Page_Load(object sender, EventArgs eventArgs)
        {
            DataTable data = new DataTable();
            data.Columns.Add("Id", typeof(int));
            data.Columns.Add("Notes", typeof(string));
            data.Columns.Add("RequestedDate", typeof(DateTime));
            for (int idx = 0; idx < 5; idx++)
            {
                DataRow row = data.NewRow();
                row["Id"] = idx;
                row["Notes"] = string.Format("Note {0}", idx);
                row["RequestedDate"] = DateTime.Now.Subtract(new TimeSpan(idx, 0, 0, 0, 0));
                data.Rows.Add(row);
            }
            listData.DataSource = data;
            listData.DataBind();
        }

        private void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            foreach (TableCell tableCell in e.Row.Cells)
            {
                DataControlFieldCell cell = (DataControlFieldCell)tableCell;
                if (cell.ContainingField.HeaderText == "Id")
                {
                    cell.Visible = false;
                    continue;
                }
                if (cell.ContainingField.HeaderText == "Notes")
                {
                    cell.Width = 400;
                    cell.BackColor = Color.Blue;
                    continue;
                }
                if (cell.ContainingField.HeaderText == "RequestedDate")
                {
                    cell.Width = 130;
                    continue;
                }
            }
        }

    </script>
</head>
<body>
    <form runat="server">
        <asp:GridView runat="server" ID="listData" AutoGenerateColumns="True" HorizontalAlign="Left"
            PageSize="20" OnRowDataBound="GridView_RowDataBound" EmptyDataText="No Data Available."
            Width="95%">
        </asp:GridView>
    </form>
</body>
</html>