codememo

그리드 보기 코드별 열 숨기기

tipmemo 2023. 11. 4. 10:49
반응형

그리드 보기 코드별 열 숨기기

내 GridView에서 ID 열을 숨기려고 합니다. 코드를 알고 있었습니다.

GridView1.Columns[0].Visible = false;

하지만 놀라운 것은 내 재산이 내 것에 대한GridView열은 0!!!데이터를 볼 수 있는 동안GridView, 그래서 무슨 생각 있어요?

감사해요.

업데이트:

다음은 다음과 같은 방법에 대한 완전한 코드입니다.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;

}

GridView.Columns.CountGridView에 있는 경우 항상 0이 됩니다.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이벤트성의

이것이 나에게 도움이 되었습니다.

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

여기 0은 숨기고 싶은 열 인덱스입니다.

원하는 열 머리글 텍스트에 대한 데이터 컨트롤 필드 컬렉션을 쿼리하고 가시성을 true로 설정하여 특정 열을 숨길 수 있습니다.

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

제가 본 답변 중 일부는 셀의 내용물을 보이지 않게 만드는 방법은 설명하지만, 전체 열을 숨기는 방법은 설명하지 않습니다. 이것이 제가 하고 싶었던 일입니다.

있다면AutoGenerateColumns = "false"그리고 실제로 사용하고 있습니다.BoundField숨기고 싶은 칼럼에 대해서 발라의 대답은 능청스럽습니다.하지만 만약 당신이 사용한다면.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가 찾고 있던 것이 아닐 수도 있지만, 제가 같은 질문을 하는 것을 발견했을 때 제가 찾고 있던 해결책입니다.

이 데이터 세트로 그리드 뷰를 묶고 있습니다.

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

그 다음에

그런 다음 for 루프에서 이와 같은 행의 수를 세어 봅니다.

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

}

그리고 헤더를 찾은 후에 우리는 눈에 보이는 거짓을 만들고 싶습니다.

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

그리드를 채우는 동안 그 컬럼을 숨기고 싶다면 이렇게 aspx 페이지 자체에서 할 수 있습니다.

<asp:BoundField DataField="test" HeaderText="test" Visible="False" />
 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

        }


    }

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

여기서 대부분의 답변은 설명하지 못합니다. 즉, 데이터를 동적으로 기반으로 하여 열을 다시 보여주고 보이지 않게 만들어야 하는 경우에는 어떻게 해야 합니까?결국은 안 되겠군요.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'은 순차적인 숫자입니다.

데이터에 따라 나중에 ON(visible="true") 또는 OFF(visible="false")가 된다는 것을 알고 있는 모든 열을 설계적으로 숨깁니다.

이 경우 기간 시간을 특정 열까지 표시하려고 합니다.예를 들어 오늘이 오전 9시라면 오전 6시, 7시, 8시, 9시를 표시하고 싶지만 오전 10시, 11시 등은 표시하지 않습니다.

다른 날에는 항상 보여주고 싶어요.뭐 이런 거.

그럼 어떻게 하죠?

사용하지 않는 이유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;
    }
}

이제 HeaderText의 Start(시작) 찾기를 기준으로 필요한 열을 켜고 헤더 텍스트가 기본값이 아닌 경우 열을 볼 수 있도록 합니다.

  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, 재설정 할 수 있습니다.GridView그리고 내가 원하는 헤더로 내가 원하는 열을 켭니다.

따라서 헤더로 표시할 다른 날짜나 기간을 선택할 때마다 GridView가 기본 헤더 텍스트와 Visible="false" 상태로 재설정된 후에gridview다시 한 번. 그렇지 않으면.PreRender, 뒤에 있는 코드가 기본 설정을 지우면 GridView에 이전 데이터의 헤더가 표시됩니다.

이 코드는 열 ID를 알 수 없고 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>

작은 변경 사항이 발생합니다. 행 데이터 경계 아래에 들어가지 않습니다. 먼저 모든 행이 바인딩되어야 합니다. 그래야 숨길 수 있습니다.따라서 그리드가 dataBound인 후에는 별도의 방법이 됩니다.

이 코드를 사용해주시기 바랍니다.비어 있으면 보이지 않는 열이 됩니다.

    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;

        }

    }

열을 숨기려면 그리드 보기의 preRender 이벤트에서 항상 열을 숨길 수 있습니다.이렇게 하면 행당 각 행 데이터 바운드 이벤트마다 하나의 작업을 줄일 수 있습니다.사전 렌더 이벤트의 경우 한 번의 작업만 수행하면 됩니다.

protected void gvVoucherList_PreRender(object sender, EventArgs e)
    {
        try
        {
            int RoleID = Convert.ToInt32(Session["RoleID"]);

            switch (RoleID)
            {
                case 6: gvVoucherList.Columns[11].Visible = false;
                    break;
                case 1: gvVoucherList.Columns[10].Visible = false;
                    break;
            }
            if(hideActionColumn == "ActionSM")
            {
                gvVoucherList.Columns[10].Visible = false;
                hideActionColumn = string.Empty;
            }
        }
        catch (Exception Ex)
        {

        }
    }

언급URL : https://stackoverflow.com/questions/3819247/gridview-hide-column-by-code

반응형