I have a problem with the ASP.NET 2.0 GridView control.
I try to access a cell of the gridview within a postback event and read the cell's text. All this works fine, until I declare the column of the cell as invisible (visible=false). Then I always get an empty string back. If I make the cell visible, I get the correct content from the cell.
This is my website:
<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="BrokerTest.aspx.cs" Inherits="BrokerTest" %>DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml" ><
head runat="server"> <title>Unbenannte Seitetitle> head><
body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" Height="39px" Style="z-index: 100; left: 0px; position: absolute; top: 0px" Width="100%" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateSelectButton="True" Caption="Ergebnis" CaptionAlign="Left" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" ShowFooter="True" DataKeyNames="a,b" OnRowCommand="GridView1_RowCommand"> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <Columns> <asp:BoundField DataField="a" HeaderText="Dokument"> <HeaderStyle HorizontalAlign="Left" /> asp:BoundField> <asp:BoundField DataField="b" HeaderText="Quelle" Visible="False"> <HeaderStyle HorizontalAlign="Left" /> asp:BoundField> <asp:ButtonField ButtonType="Button" CommandName="show" HeaderText="Anzeigen" Text="Anzeigen" ShowHeader="True"> <ItemStyle HorizontalAlign="Center" Width="40px" /> asp:ButtonField> Columns> <RowStyle BackColor="#EFF3FB" /> <EditRowStyle BackColor="#2461BF" /> <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" /> asp:GridView> <asp:Label ID="Label1" runat="server" Style="z-index: 102; left: 18px; position: absolute;top: 456px"
Text="Label" Width="229px">asp:Label> div> form> body> html>And this is my populate and read content code:
private
DataTable CreateTable(){
try{
DataTable table = new DataTable(); // Declare DataColumn and DataRow variables. DataColumn column; // Create new DataColumn, set DataType, ColumnName // and add to DataTable.column =
new DataColumn();column.DataType = System.
Type.GetType("System.String");column.ColumnName =
"a";table.Columns.Add(column);
// Create second column.column =
new DataColumn();column.DataType =
Type.GetType("System.String");column.ColumnName =
"b";table.Columns.Add(column);
// Create second column.column =
new DataColumn();column.DataType =
Type.GetType("System.String");column.ColumnName =
"c";table.Columns.Add(column);
return table;}
catch (Exception ex){
throw new Exception(ex.Message);}
}
protected void Page_Load(object sender, EventArgs e){
if (!IsPostBack){
DataTable dc = CreateTable(); DataRow dr;dr = dc.NewRow();
dr[
"a"] = "Hallo1";dr[
"b"] = "Hallo2";dr[
"c"] = "Path1";dc.Rows.Add(dr);
dr = dc.NewRow();
dr[
"a"] = "Hallo3";dr[
"b"] = "Hallo4";dr[
"c"] = "Path2";dc.Rows.Add(dr);
GridView1.DataSource = dc;
GridView1.DataBind();
}
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e){
if (e.CommandName == "show"){
int index = Convert.ToInt32(e.CommandArgument); GridViewRow selectedRow = GridView1.Rows[index]; TableCell a = selectedRow.Cells[2]; String s = a.Text;Label1.Text =
"" + s + "";}
}
The method GridView1_RowCommand returns an empty string.
When I change the 2nd column like this:
<asp:BoundField DataField="b" HeaderText="Quelle" Visible="True"> <HeaderStyle HorizontalAlign="Left" /> asp:BoundField>
the correct content is returned.
But I have to make this column invisible, because I need to store extra data with every row that I don't want to show in the gridview.
Any idea what I am doing wrong?
Pankaj GuptaPosted Oct 31, 2006, 1:51 AM
In the Asp.net 2.0, anything that is invisible at design time will not render.
So for this you have to play with a tatic.
1. First of all make the 2nd column visible="true"
2. just add the 2 lines of code before or after the grid view bindings like this
GridView1.Columns[1].Visible = true;
// add your code of data bindings
GridView1.Columns[1].Visible = false;
3. It will make the column visible false but you will also get the value also.