DataGrid中如何隐藏掉一列,但是仍要能访问到这一列呢?可不可以做到?

时间:2020-12-01 09:52:42
老板要求,作为主键的列不能显示给用户,要隐藏,但是
这一列我必须可以访问,如下:

string selectCmd="select id,name,no from table1";
string conn="server=ip;database=test;uid=sa;pwd";
SqlConnection myConn=new Connection(conn);
DataSet ds=new DataSet();
SqlDataAdapter myAdapter=new SqlDataAdaper(selectCmd,myConn);
myAdatper.Fill(ds,"table1");
MyDataGrid.DataSource=ds.Tables["table1"].DefaultView;
MyDataGrid.DataBind();

源代码如上,我想隐藏id那一列,他只是不可见,
在服务器端我还必须能取到他的值,只是对用户不可见
这样能办到么?

31 个解决方案

#1


你可以设置:MyDataGrid..Columns[0].Visible=false;
就是第一列为不可视,其他列以此类推。

#2


对,就是楼上说的那样,补充一点,这句必须在.DataBind()之前,.DataSource()=..之后。

#3


错误:
索引超出范围。必须为非负值并小于集合大小。参数名:index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名:index

代码:
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.DataBind();
MyDataGrid.Columns[1].Visible=false;

注:我第一列加了LinkButton的

#4


我刚看到,sorry

#5


但是,错误提示是一样的阿

无论是上面的代码,还是下面的代码都是那个提示,难道是index错了?
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.Columns[1].Visible=false;
MyDataGrid.DataBind();

#6


你不加这行code"MyDataGrid.Columns[1].Visible=false;"会有错误吗?
或者你试一试:MyDataGrid.Columns[0].Visible=false;

#7


没有肯定是正常的,因为一直以来都是这样的,
昨天老板说要隐藏那一列,所以就要隐藏,但是
服务器端还必须要访问得到

#8


有没有什么属性要设置的

只有我自己加的那一列可以隐藏掉,其他的都报错

#9


AutoGenerateColumns属性设置为False后再试试...

#10


阿甘,还记得我把,谢谢你寄个代码给我,虽然没用上:)
index错误我是这样解决的
:string fri=e.Item.Cells[1].Text;

#11


当然索引会超出范围,因为在datagrid创建之前你的列并不存在,你可以这样解决,用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。你比我幸运,我的表格是动态显示字段,所以这个办法不灵,你的如果固定要显示这几个字段就肯定行

#12


顺便说一句,如果用你的代码,AutoGenerateColumns属性设置为False是不行的,我好像式过

#13


然索引会超出范围,因为在datagrid创建之前你的列并不存在,你可以这样解决,用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。你比我幸运,我的表格是动态显示字段,所以这个办法不灵,你的如果固定要显示这几个字段就肯定行

对不起,你说的我不太明白.
如何做到这"用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。"

能把代码写给我么或者vs.net的操作步骤?
对datagrid的其他操作我没有用过,不知从何下手

谢谢

#14


这种问题必须在DataGrid中控制才可以解决
<Columns>
<asp:BoundColumn DataField="Stu_ID" HeaderText="学" Visible =False ></asp:BoundColumn>
</Columns>
向上面那样就可以了,没有问题的我都使用过的

#15


使用绑定列

不绑定就可以了,不过还是可以访问

#16


to:exhx

<asp:DataGrid id="DataGrid1" runat="server" Width="100%">
  <Columns>
     <asp:BoundColumn DataField="au_id" HeaderText="学"
          Visible="False"></asp:BoundColumn>
  </Columns>
</asp:DataGrid>


string conn="server=(local);database=pubs;uid=sa;pwd=";
string selectCmd="select au_id,au_lname from authors";
SqlConnection myConn=new SqlConnection(conn);
DataSet ds=new DataSet();
SqlDataAdapter myAdapter=new SqlDataAdapter(selectCmd,myConn);
myAdapter.Fill(ds,"authors");
DataGrid1.DataSource=ds.Tables["authors"].DefaultView;
DataGrid1.DataBind();

但是au_id那一列还是照常显示的?
why?

#17


use 
DataGrid.DataKeyField   &
DataGrid.DataKeys

#18


to: Inyoureyes(最深的蓝) 

通过各位的指点,DataGrid必须加上AutoGenerateColumns=false属性
才能隐藏列
<asp:DataGrid id="DataGrid1" runat="server" Width="100%"
     AutoGenerateColumns="False">
     <Columns> <asp:BoundColumn DataField="au_id" HeaderText="学"   
             Visible="false"></asp:BoundColumn>
      </Columns>
</asp:datagrid>

这样设置就隐藏了au_id列,
我也没你那么幸运,我的datagrid也是动态的,列不是固定的,所以
还要向你请教如何处理.

#19


AutoGenerateColumns=false当然可以隐藏列,你只要不把那烈绑定到DataGrid中就行了,就是在<Columns>中只绑定你需要显示的列,其他列就不会显示了。没必要设置Visible属性

#20


那么我是不是还可以访问没有bind的列?就是不显示的列?

还有如果我的列并不是固定的,该怎么办?

#21


当然可以访问

模版列功能更强大

#22


那么如果我的列不固定如何band呢?

请教了

#23


en
看来你是想在自动生成列的时候隐藏数据源的某些字段

那就在DataGrid1_ItemCreated事件中
加上这个
if (e.Item.Cells.Count>1)
   e.Item.Cells[1].Visible=false;

#24


你的DataBind出来后,datagrid上有值吗?datasource的来源是不能为null的,但是可以为空。你找yxrj的办法试一下。

或者,把代码mail给我,帮你看看:juqiang@Genersoft.com

#25


<asp:datagrid id="MyDataGrid" AutoGenerateColumns=False 
    runat="server" AllowPaging="True" PageSize="6" Width="100%" 
     DataKeyField="fileid" Height="82px"> <Columns>   
            <asp:TemplateColumn>
            <HeaderTemplate>
           查看
</HeaderTemplate>
<ItemTemplate>
           <asp:LinkButton ID="SeeIt" 
       CommandName="Select" Runat="server">查看</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<Columns> <asp:BoundColumn DataField="fileid" 
              HeaderText="fileid" Visible="false"></asp:BoundColumn>
          <asp:BoundColumn DataField="文件标题" HeaderText="文件标题" Visible="true"></asp:BoundColumn>
<asp:BoundColumn DataField="文件类型" HeaderText="文件类型" Visible="true"></asp:BoundColumn>
<asp:BoundColumn DataField="当前流程" HeaderText="当前流程" Visible="false"></asp:BoundColumn>
</Columns>
<PagerStyle NextPageText="下一页" PrevPageText="上一页" HorizontalAlign="Center"></PagerStyle>

</asp:datagrid>

"查看"列触发的事件

private void MyDataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if (e.CommandName.ToString()=="Select")
{
}
}

如上代码,我实现了隐藏"fileid"和="当前流程"两列而又可以访问到他们,

但是下一次我的datagrid所邦定的数据源要变,列也要便,
那么:
<asp:BoundColumn DataField="" HeaderText="" 
    Visible="">
</asp:BoundColumn>

这部分代码如何反映当前datagrid所bind的数据呢?

#26


上面就是我的代码中的关键部分,请大家指教!
谢谢各位

#27


这样写试试
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.DataBind();
MyDataGrid.Columns[1].Visible=false;

#28


使用DataGrid一般有2种办法
1.AutoGenerateColumns=Ture
2.AutoGenerateColumns=False 
  a.在aspx里设好列
  b.在cs里动态添加列

对于1,自动产生的列不在DataGrid.Columns集合里,我目前想到的办法在前面提过了。

对于2,不论a或b,都可以从DataGrid.Columns入手,设定每个Column的Visible属性。

#29


这就好说都了
谢谢指点!

#30


怎么现在看见大部分的都喜欢用GridView。。其实介意lz用repeater。。功能强大扩展性好

#31


怎么现在看见大部分的都喜欢用GridView。。其实介意lz用repeater。。功能强大扩展性好

#1


你可以设置:MyDataGrid..Columns[0].Visible=false;
就是第一列为不可视,其他列以此类推。

#2


对,就是楼上说的那样,补充一点,这句必须在.DataBind()之前,.DataSource()=..之后。

#3


错误:
索引超出范围。必须为非负值并小于集合大小。参数名:index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名:index

代码:
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.DataBind();
MyDataGrid.Columns[1].Visible=false;

注:我第一列加了LinkButton的

#4


我刚看到,sorry

#5


但是,错误提示是一样的阿

无论是上面的代码,还是下面的代码都是那个提示,难道是index错了?
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.Columns[1].Visible=false;
MyDataGrid.DataBind();

#6


你不加这行code"MyDataGrid.Columns[1].Visible=false;"会有错误吗?
或者你试一试:MyDataGrid.Columns[0].Visible=false;

#7


没有肯定是正常的,因为一直以来都是这样的,
昨天老板说要隐藏那一列,所以就要隐藏,但是
服务器端还必须要访问得到

#8


有没有什么属性要设置的

只有我自己加的那一列可以隐藏掉,其他的都报错

#9


AutoGenerateColumns属性设置为False后再试试...

#10


阿甘,还记得我把,谢谢你寄个代码给我,虽然没用上:)
index错误我是这样解决的
:string fri=e.Item.Cells[1].Text;

#11


当然索引会超出范围,因为在datagrid创建之前你的列并不存在,你可以这样解决,用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。你比我幸运,我的表格是动态显示字段,所以这个办法不灵,你的如果固定要显示这几个字段就肯定行

#12


顺便说一句,如果用你的代码,AutoGenerateColumns属性设置为False是不行的,我好像式过

#13


然索引会超出范围,因为在datagrid创建之前你的列并不存在,你可以这样解决,用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。你比我幸运,我的表格是动态显示字段,所以这个办法不灵,你的如果固定要显示这几个字段就肯定行

对不起,你说的我不太明白.
如何做到这"用datagrid的属性生成器创建几个邦定列,分别邦定到id,name,no,然后再属性生成器中有一个复选框决定该列是否可见,将邦定到id的那一列隐藏就行了,当然还要设置表格的数据源。"

能把代码写给我么或者vs.net的操作步骤?
对datagrid的其他操作我没有用过,不知从何下手

谢谢

#14


这种问题必须在DataGrid中控制才可以解决
<Columns>
<asp:BoundColumn DataField="Stu_ID" HeaderText="学" Visible =False ></asp:BoundColumn>
</Columns>
向上面那样就可以了,没有问题的我都使用过的

#15


使用绑定列

不绑定就可以了,不过还是可以访问

#16


to:exhx

<asp:DataGrid id="DataGrid1" runat="server" Width="100%">
  <Columns>
     <asp:BoundColumn DataField="au_id" HeaderText="学"
          Visible="False"></asp:BoundColumn>
  </Columns>
</asp:DataGrid>


string conn="server=(local);database=pubs;uid=sa;pwd=";
string selectCmd="select au_id,au_lname from authors";
SqlConnection myConn=new SqlConnection(conn);
DataSet ds=new DataSet();
SqlDataAdapter myAdapter=new SqlDataAdapter(selectCmd,myConn);
myAdapter.Fill(ds,"authors");
DataGrid1.DataSource=ds.Tables["authors"].DefaultView;
DataGrid1.DataBind();

但是au_id那一列还是照常显示的?
why?

#17


use 
DataGrid.DataKeyField   &
DataGrid.DataKeys

#18


to: Inyoureyes(最深的蓝) 

通过各位的指点,DataGrid必须加上AutoGenerateColumns=false属性
才能隐藏列
<asp:DataGrid id="DataGrid1" runat="server" Width="100%"
     AutoGenerateColumns="False">
     <Columns> <asp:BoundColumn DataField="au_id" HeaderText="学"   
             Visible="false"></asp:BoundColumn>
      </Columns>
</asp:datagrid>

这样设置就隐藏了au_id列,
我也没你那么幸运,我的datagrid也是动态的,列不是固定的,所以
还要向你请教如何处理.

#19


AutoGenerateColumns=false当然可以隐藏列,你只要不把那烈绑定到DataGrid中就行了,就是在<Columns>中只绑定你需要显示的列,其他列就不会显示了。没必要设置Visible属性

#20


那么我是不是还可以访问没有bind的列?就是不显示的列?

还有如果我的列并不是固定的,该怎么办?

#21


当然可以访问

模版列功能更强大

#22


那么如果我的列不固定如何band呢?

请教了

#23


en
看来你是想在自动生成列的时候隐藏数据源的某些字段

那就在DataGrid1_ItemCreated事件中
加上这个
if (e.Item.Cells.Count>1)
   e.Item.Cells[1].Visible=false;

#24


你的DataBind出来后,datagrid上有值吗?datasource的来源是不能为null的,但是可以为空。你找yxrj的办法试一下。

或者,把代码mail给我,帮你看看:juqiang@Genersoft.com

#25


<asp:datagrid id="MyDataGrid" AutoGenerateColumns=False 
    runat="server" AllowPaging="True" PageSize="6" Width="100%" 
     DataKeyField="fileid" Height="82px"> <Columns>   
            <asp:TemplateColumn>
            <HeaderTemplate>
           查看
</HeaderTemplate>
<ItemTemplate>
           <asp:LinkButton ID="SeeIt" 
       CommandName="Select" Runat="server">查看</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<Columns> <asp:BoundColumn DataField="fileid" 
              HeaderText="fileid" Visible="false"></asp:BoundColumn>
          <asp:BoundColumn DataField="文件标题" HeaderText="文件标题" Visible="true"></asp:BoundColumn>
<asp:BoundColumn DataField="文件类型" HeaderText="文件类型" Visible="true"></asp:BoundColumn>
<asp:BoundColumn DataField="当前流程" HeaderText="当前流程" Visible="false"></asp:BoundColumn>
</Columns>
<PagerStyle NextPageText="下一页" PrevPageText="上一页" HorizontalAlign="Center"></PagerStyle>

</asp:datagrid>

"查看"列触发的事件

private void MyDataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if (e.CommandName.ToString()=="Select")
{
}
}

如上代码,我实现了隐藏"fileid"和="当前流程"两列而又可以访问到他们,

但是下一次我的datagrid所邦定的数据源要变,列也要便,
那么:
<asp:BoundColumn DataField="" HeaderText="" 
    Visible="">
</asp:BoundColumn>

这部分代码如何反映当前datagrid所bind的数据呢?

#26


上面就是我的代码中的关键部分,请大家指教!
谢谢各位

#27


这样写试试
MyDataGrid.DataSource=ds.Tables["myTable"].DefaultView;
MyDataGrid.DataBind();
MyDataGrid.Columns[1].Visible=false;

#28


使用DataGrid一般有2种办法
1.AutoGenerateColumns=Ture
2.AutoGenerateColumns=False 
  a.在aspx里设好列
  b.在cs里动态添加列

对于1,自动产生的列不在DataGrid.Columns集合里,我目前想到的办法在前面提过了。

对于2,不论a或b,都可以从DataGrid.Columns入手,设定每个Column的Visible属性。

#29


这就好说都了
谢谢指点!

#30


怎么现在看见大部分的都喜欢用GridView。。其实介意lz用repeater。。功能强大扩展性好

#31


怎么现在看见大部分的都喜欢用GridView。。其实介意lz用repeater。。功能强大扩展性好