我想我們都知道在數據庫中如何添加自增長列,我們可以將這個自增長列綁定到DataGrid上使得用戶方便的知道現在是第幾行,今天我介紹一種不用數據庫就可以簡單顯示出自增長列的方法,有人可能會說既然數據庫支持我們為什麼這樣做?我想有如下的兩個理由:1、不是所有的表都有自增長列。2、當自增長列不自動復制的時候會出現斷號的現象,即使復制這也是有可能發生的。但是先要說明的是這個方法只能顯示出來當前頁的序號,也就是說如果有分頁它只能標記當前這一頁的序號。如果要同樣實現分頁的功能我想使用數據庫要比這種方法簡單一些,因為如果還是用這個方法那麼將要處理狀態,這裡我不考慮這種方法,但是在文章的結尾我將給出一個數據庫的解決方案。
好了下面是正題,首先我們需要在頁面裡放置一個DataGrid。我們用Northwind數據庫做例子:
html頁面的DataGrid如下所示:
<asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" AllowPaging="True">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<!-- 這裡是關鍵-->
<SPAN>
<%# Container.ItemIndex+1 %></SPAN>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="CategoryName"></asp:BoundColumn>
<asp:BoundColumn DataField="Description"></asp:BoundColumn>
</Columns>
</asp:datagrid>
下面我們可以寫他的後台代碼cs的文件了我們在它的Page_Load裡面添加綁定方法如下所示:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
strConnection = ConfigurationSettings.AppSettings["sa"].ToString();
myConnection = new SqlConnection(strConnection);
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT CategoryName, Description FROM Categories",myConnection);
// 為了分頁方便ds是一個全局的變量
myAdapter.Fill(ds);
this.grdTest.DataSource = ds.Tables[0].DefaultView;
this.grdTest.DataBind();
}
從上面的過程可以看出我們使用的是表Categories,這樣我們就可以產生一列自增長的列,此列是從1開始的。如果我們想要一個從0開始的列有該怎麼辦呢?我們可以把<!-- 這裡是關鍵-->下面的<span>裡面的東西換成<asp:Label id=lblRowNumber runat="server" Text='<%# DataBinder.Eval(Container, "ItemIndex", "{0}") %>'>就可以了。
如果我們想要實現分頁也顯示的方法我們將使用DataTable的方法來實現,首先我們將DataGrid的列全部變成綁定列(為了方便演示,不是必須)。如下所示:
<asp:table id="tbData" runat="server" BackColor="LightSteelBlue" Height="13px" Width="16px" Font-Names="宋體" Font-Name="宋體" Font-Size="8pt" CellPadding="1" CellSpacing="0" BorderColor="black" BorderWidth="1" Gridlines="Both"></asp:table><br>
<asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" PageSize="2" AllowPaging="True">
<Columns>
<asp:BoundColumn DataField="RowNumber" HeaderText="RowNumber"></asp:BoundColumn>
<asp:BoundColumn DataField="CategoryName"></asp:BoundColumn>
<asp:BoundColumn DataField="Description"></asp:BoundColumn>
</Columns>
</asp:datagrid>
在後台我們添加一個函數:
private DataTable GetRowNumberTable(DataTable dt){
DataColumn col = new DataColumn("RowNumber",Type.GetType("System.Int32"));
dt.Columns.Add(col);
for(int i = 0;i<=dt.Rows.Count-1;i++){
if(0 == i)
dt.Rows[i][col] = 1;
else
dt.Rows[i][col] = Convert.ToInt32(dt.Rows[i-1][col]) +1;
}
return dt;
}
然後我們將原來數據源改成如下:
this.grdTest.DataSource = this.GetRowNumberTable(ds.Tables[0]).DefaultView;
這樣一來即使分頁,數字也是連續的,並且將編號應用於所有的行而不是當前這一頁的行。