小さな知識(十)
38527 ワード
1.virtual(ダミーメソッド)+override(書き換え)とnew(上書き)
virtual+overrideとnewはいずれもサブクラスの親メソッドの変更を実現できるが,前者は多態性を実現できる.
例えば親クラスclass 1には方法a()、b()の子クラスclass 2には方法c()がある.
class1 c1=new class2();
このときc 1は.c 1を点出する.a() c1.b()この2つのclass 1の自分の方法の実例の方法はタイプを見ます
ただし、親クラスclass 1にvitual a()、b()サブクラスclass 2にoverride a()、c()がある場合
このときc 1は.c 1を点出する.a() c1.b()この2つの方法があるが、この場合c 1.a()はclass 2のa()メソッドを呼び出し,虚メソッドは対象を見てclass 2のa()はclass 1のa()と完全に異なることができ,それによって多態性を実現する(同じものが異なる条件で異なる形態を表現できることを指す)
以上はいったいどのクラスのa()を呼び出すのか,here静的メソッドビュータイプ,インスタンスメソッドビュータイプ,虚的メソッドオブジェクトを記憶することができる.
newについては、インスタンスメソッドと同様に見ることができますが、以下のように異なります.
protected void Page_Load(object sender, EventArgs e)
[挿入:親class 1とその子class 2の間の遷移は、親参照が子オブジェクトを指す場合のみです(または、子参照が暗黙的に親参照に変換されます):
class1 c1=new class2(); またはclass 2 c 2=new class 2();class1 c1=c2;
一方class 2 c 2=(class 2)new class 1();またはclass 1 c 1=new class 1();class2 c2=(class2)c1;
コンパイルは可能ですが、実行時にSystemをエラーします.InvalidCastException ]
継承関係のある2つのクラスを見ることができます.2つのクラスには同じ方法があります.1つはvirtualです.1つはoverrideです.そうすれば、虚の方法でオブジェクトを見ることができます.
ここで一つはvirtual一つはnewが虚とは言えない方法でオブジェクトを見ることができるのは実例の方法でタイプを見ることができる.
しかしnewのタイプは純粋な例の方法とは異なり、c 1を見た.print()はclass 1ではなくclass 3を出力します.newはこの継承チェーンの中でこのタイプ(インスタンスメソッドはタイプのこのタイプを見ます.ここではclass 1)から最も遠いoverrideを見ます.ここでclass 3です.そしてclass 4はnewです.class 2のoverrideをvirtualに変更すると、class 1が出力されます.class 2にはoverride class 1の方法がないので、だからclass 1まで最も遠いここはClass 3で、そのprint()はclass 3を出力します
次に、純粋なインスタンスの方法を見てみましょう.
protected void Page_Load(object sender, EventArgs e)
2.GetType().GetField()
FieldInfo fi = this.GetType().GetField(フィールド名、BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.IgnoreCase);
if(fi!=null){fi.GetValue(this);}
以上の文の意味は、あるオブジェクト(ここではthisが現在のオブジェクト)の共通フィールド(フィールド名を指定してもよいし、GetFields()メソッドでオブジェクトのすべてのフィールドを取得してもよい)を取得し、フィールド情報クラスFieldInfoのオブジェクトfiに返してfiを通過することである.GetValue(this)は、オブジェクトのフィールドの値を取得し、その値を元のタイプに強制的に変換することができます.この場合、フィールドを操作できます.
例えば、ここで取得するフィールドは、本来string[]タイプ(string[])fiである.GetValue(this)
フィールドタイプがコントロールタイプであれば、Textなど、このテキストボックスコントロールのプロパティなどを操作できます.以下のようにします.
http://topic.csdn.net/u/20080805/19/d4fcd0c2-6124-4456-8b02-968f3c4bdc4e.html
3.Excelインポートhttp://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html
1.
public class ImportExcel
2.
3
4エラーが発生したら停止するのではなく、すべてのエラーを入力した初期txterrorInfoがエラーメッセージであることを示します:r
4. .NetでButtonボタンをクリックしてクリックイベントを実行しない
この場合、Buttonボタンがあるページには2つ以上のFormラベルがある可能性があります.
5.会社のページング方法(二)
ページングするReapter、GridViewなどを配置できるユーザーコントロールが使用されています...
HTMLコードは次のとおりです.
バックグラウンドコードは次のとおりです.
PageNavigatorページのバックグラウンド・コードは次のとおりです.
上記のGetPageメソッドは次のとおりです.
上のFetPageSqlの方法は以下の通りです.
virtual+overrideとnewはいずれもサブクラスの親メソッドの変更を実現できるが,前者は多態性を実現できる.
例えば親クラスclass 1には方法a()、b()の子クラスclass 2には方法c()がある.
class1 c1=new class2();
このときc 1は.c 1を点出する.a() c1.b()この2つのclass 1の自分の方法の実例の方法はタイプを見ます
ただし、親クラスclass 1にvitual a()、b()サブクラスclass 2にoverride a()、c()がある場合
このときc 1は.c 1を点出する.a() c1.b()この2つの方法があるが、この場合c 1.a()はclass 2のa()メソッドを呼び出し,虚メソッドは対象を見てclass 2のa()はclass 1のa()と完全に異なることができ,それによって多態性を実現する(同じものが異なる条件で異なる形態を表現できることを指す)
以上はいったいどのクラスのa()を呼び出すのか,here静的メソッドビュータイプ,インスタンスメソッドビュータイプ,虚的メソッドオブジェクトを記憶することができる.
newについては、インスタンスメソッドと同様に見ることができますが、以下のように異なります.
public class Class1
{
public virtual string print()
{
return "class1";
}
public void class1() { }
public virtual string class1_1() { return "class1"; }
}
public class Class2 : Class1
{
public override string print()
{
return "class2";
}
}
public class Class3 : Class2
{
public override string print()
{
return "class3";
}
}
public class Class4 : Class3
{
public new string print()
{
return "class4";
}
}
public class Class5 : Class4
{
public new string print()
{
return "class5";
}
public override string class1_1(){ return "class5";}
public void class5() { }
}
protected void Page_Load(object sender, EventArgs e)
{
Class5 c5 = new Class5();
Class1 c1 = c5; // ( )( Class1 c1 = new Class5(); )
Label1.Text += c1.print(); //class3 print() , Class5 new override
Label1.Text += " " + c1.class1_1(); //class5
}
[挿入:親class 1とその子class 2の間の遷移は、親参照が子オブジェクトを指す場合のみです(または、子参照が暗黙的に親参照に変換されます):
class1 c1=new class2(); またはclass 2 c 2=new class 2();class1 c1=c2;
一方class 2 c 2=(class 2)new class 1();またはclass 1 c 1=new class 1();class2 c2=(class2)c1;
コンパイルは可能ですが、実行時にSystemをエラーします.InvalidCastException ]
継承関係のある2つのクラスを見ることができます.2つのクラスには同じ方法があります.1つはvirtualです.1つはoverrideです.そうすれば、虚の方法でオブジェクトを見ることができます.
ここで一つはvirtual一つはnewが虚とは言えない方法でオブジェクトを見ることができるのは実例の方法でタイプを見ることができる.
しかしnewのタイプは純粋な例の方法とは異なり、c 1を見た.print()はclass 1ではなくclass 3を出力します.newはこの継承チェーンの中でこのタイプ(インスタンスメソッドはタイプのこのタイプを見ます.ここではclass 1)から最も遠いoverrideを見ます.ここでclass 3です.そしてclass 4はnewです.class 2のoverrideをvirtualに変更すると、class 1が出力されます.class 2にはoverride class 1の方法がないので、だからclass 1まで最も遠いここはClass 3で、そのprint()はclass 3を出力します
次に、純粋なインスタンスの方法を見てみましょう.
public class Class6
{
public string print1()
{
return "class6";
}
}
public class Class7:Class6
{
public string print2()
{
return "class7";
}
}
public class Class8:Class7
{
public string print3()
{
return "class8";
}
}
protected void Page_Load(object sender, EventArgs e)
{
Class8 c8 = new Class8();
Class6 c6 = c8;
Label2.Text += c6.print1(); //class6
}
2.GetType().GetField()
FieldInfo fi = this.GetType().GetField(フィールド名、BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.IgnoreCase);
if(fi!=null){fi.GetValue(this);}
以上の文の意味は、あるオブジェクト(ここではthisが現在のオブジェクト)の共通フィールド(フィールド名を指定してもよいし、GetFields()メソッドでオブジェクトのすべてのフィールドを取得してもよい)を取得し、フィールド情報クラスFieldInfoのオブジェクトfiに返してfiを通過することである.GetValue(this)は、オブジェクトのフィールドの値を取得し、その値を元のタイプに強制的に変換することができます.この場合、フィールドを操作できます.
例えば、ここで取得するフィールドは、本来string[]タイプ(string[])fiである.GetValue(this)
フィールドタイプがコントロールタイプであれば、Textなど、このテキストボックスコントロールのプロパティなどを操作できます.以下のようにします.
http://topic.csdn.net/u/20080805/19/d4fcd0c2-6124-4456-8b02-968f3c4bdc4e.html
3.Excelインポートhttp://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html
1.
public class ImportExcel
{
HSSFWorkbook hssfworkbook;
/// <summary>
/// Excel
/// </summary>
/// <param name="path">Excel </param>
/// <param name="sheetindex"> sheet</param>
/// <returns>DataTable</returns>
public DataTable ReadExcel(string path,int sheetindex,int startrow)
{
using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
try
{
ISheet sheet = hssfworkbook.GetSheetAt(sheetindex);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
int cellcount = 0;
while (rows.MoveNext())
{
int max=((HSSFRow)rows.Current).LastCellNum;
if (max>cellcount)
{
cellcount = max;
}
}
for (int j = 1; j < cellcount+1; j++)
{
//dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
if (j==1)
{
dt.Columns.Add(" / ");
}
dt.Columns.Add(" "+j.ToString());
}
rows.Reset();
int currentrow = 0;
while (rows.MoveNext())
{
currentrow++;
if (currentrow<startrow)
{
continue;
}
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
if (currentrow == startrow)
{
dr[0] = "";
}
else
{
dr[0] = " "+(currentrow-startrow).ToString();
}
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i+1] = null;
}
else
{
if (currentrow == startrow)
{
dr[i + 1] = cell.ToString();
}
else
{
string typestr = GetType(cell.CellType);
dr[i + 1] = cell.ToString()+"-"+(currentrow-startrow)+" "+(i+1).ToString()+" "+"-"+"[" + typestr + "]";
}
}
}
dt.Rows.Add(dr);
}
return dt;
}
catch (Exception e)
{
return null;
}
}
public string GetType(CellType ct)
{
string typestr = null;
switch (ct)
{
case CellType.BLANK:
typestr= " ";
break;
case CellType.BOOLEAN:
typestr = " ";
break;
case CellType.ERROR:
typestr = " ";
break;
case CellType.FORMULA:
typestr = " ";
break;
case CellType.NUMERIC:
typestr = " ";
break;
case CellType.STRING:
typestr = " ";
break;
case CellType.Unknown:
typestr = "Unknown";
break;
}
return typestr;
}
}
2.
public class ExcelHelper
{
string[] DataType = null; //
string[] IsMust =null; //
MobanItem mobandal = new MobanItem(); // ( )
/// <summary>
/// Excel ,
/// </summary>
/// <param name="sheet">ISheet </param>
/// <param name="startrow"> </param>
/// <param name="mbID"> ID</param>
/// <returns>DataTable</returns>
public DataTable ReadExcel(ISheet sheet, int startrow, int mbID)
{
DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
DataType = new string[dtmoban.Rows.Count];
IsMust = new string[dtmoban.Rows.Count];
//
for (int i = 0; i < dtmoban.Rows.Count; i++)
{
DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
}
//
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
//
int cellcount = 0;
while (rows.MoveNext())
{
int max = ((HSSFRow)rows.Current).LastCellNum;
if (max > cellcount)
{
cellcount = max;
}
}
for (int j = 1; j < cellcount + 1; j++)
{
if (j == 1)
{
dt.Columns.Add(" / ");
}
dt.Columns.Add(" " + j.ToString());
}
// rows.MoveNext(), Reset()
rows.Reset();
int currentrow = 0;
// 、 DataTable
while (rows.MoveNext())
{
currentrow++;
if (currentrow < startrow)
{
continue;
}
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
if (currentrow == startrow)
{
dr[0] = "";
}
else
{
dr[0] = " " + (currentrow - startrow).ToString();
}
for (int i = 0; i < row.LastCellNum; i++)
{
ICell cell = row.GetCell(i);
// , ( ), ExcelImportException
if (cell == null && IsMust[i] == "1")
{
throw new ExcelImportException(currentrow, i + 1, " ");
}
else
{
if (currentrow == startrow)
{
dr[i + 1] = cell.ToString();
}
else
{
//string typestr = GetType(cell.CellType);
string value = cell.ToString();
string type = DataType[i];
// , ( ), ExcelImportException
//if (typestr != DataType[i])
//{
// throw new ExcelImportException(currentrow, i + 1, " " + DataType[i]);
//}
if (GetTypeNew(value,type)!=true)
{
throw new ExcelImportException(currentrow, i + 1, " " + DataType[i]);
}
dr[i + 1] = cell.ToString();
}
}
}
dt.Rows.Add(dr);
}
return dt;
}
public bool GetTypeNew(string value,string type)
{
bool flag = true;
switch (type)
{
case " ":
flag = value == "" ? true : false;
break;
case " ":
try
{
decimal.Parse(value);
}
catch (Exception e)
{
flag = false;
}
break;
case " ":
try
{
DateTime.Parse(value);
}
catch (Exception e)
{
flag = false;
}
break;
case " ":
flag = true;
break;
}
return flag;
}
public string GetType(CellType ct)
{
string typestr = null;
switch (ct)
{
case CellType.BLANK:
typestr = " ";
break;
case CellType.BOOLEAN:
typestr = " ";
break;
case CellType.ERROR:
typestr = " ";
break;
case CellType.FORMULA:
typestr = " ";
break;
case CellType.NUMERIC:
typestr = " ";
break;
case CellType.STRING:
typestr = " ";
break;
case CellType.Unknown:
typestr = "Unknown";
break;
}
return typestr;
}
}
public class ExcelImportException : Exception
{
public int rowNum;
public int colNum;
public string msg;
/// <summary>
///
/// </summary>
/// <param name="rn"> </param>
/// <param name="cn"> </param>
/// <param name="errormsg"> </param>
public ExcelImportException(int rn, int cn, string errormsg)
{
rowNum = rn;
colNum = cn;
msg = errormsg;
}
}
3
/// <summary>
/// Excel ,
/// </summary>
/// <param name="sheet">ISheet </param>
/// <param name="mbID"> ID</param>
/// <returns>DataTable</returns>
public DataTable ReadExcel(ISheet sheet, int mbID)
{
DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
DataType = new string[dtmoban.Rows.Count];
IsMust = new string[dtmoban.Rows.Count];
//
for (int i = 0; i < dtmoban.Rows.Count; i++)
{
DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
}
//
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
//
int importRowNum = 0;
//
int importColNum = 0;
while (rows.MoveNext())
{
try
{
string FirstCellStr = ((HSSFRow)rows.Current).GetCell(0).ToString();
string SecondCellStr = ((HSSFRow)rows.Current).GetCell(1).ToString();
if (FirstCellStr == " " || FirstCellStr == " " || SecondCellStr == " ")
{
importRowNum = ((HSSFRow)rows.Current).RowNum + 1;
importColNum = ((HSSFRow)rows.Current).LastCellNum;
break;
}
}
catch (Exception ex)
{
continue;
}
}
// , DataTable
try
{
for (int j = 0; j < importColNum; j++)
{
dt.Columns.Add(" " + j.ToString());
}
}
catch (Exception)
{
return dt;
}
// rows.MoveNext(), Reset()
rows.Reset();
// 、 DataTable
while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
int currentRowNum = row.RowNum;
if (currentRowNum < importRowNum)
{
continue;
}
DataRow dr = dt.NewRow();
// DataTable i 1 DataType IsMust 1
ICell cellxh = row.GetCell(0); //
for (int i = 1; i < importColNum; i++)
{
ICell cell = row.GetCell(i);
// , ( ), ExcelImportException
if (cell == null && IsMust[i - 1] == "1")
{
throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", " [" + cellxh.ToString() + "]", " [" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", " [ ]");
}//
else if (cell == null && IsMust[i - 1] != "1")
{
dr[i] = "";
}
else
{
string value = cell.ToString();
string type = DataType[i - 1];
if (GetTypeNew(value, type) != true)
{
throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", " [" + cellxh.ToString() + "]", " [" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", " [ " + DataType[i] + "]");
}
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
dt.Columns.RemoveAt(0); //
return dt;
}
4エラーが発生したら停止するのではなく、すべてのエラーを入力した初期txterrorInfoがエラーメッセージであることを示します:r
/// <summary>
/// Excel ,
/// </summary>
/// <param name="sheet">ISheet </param>
/// <param name="mbID"> ID</param>
/// <param name="txtErrorInfo"> </param>
/// <returns>DataTable</returns>
public DataTable ReadExcel(ISheet sheet, int mbID,ref string txtErrorInfo)
{
DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
DataType = new string[dtmoban.Rows.Count];
IsMust = new string[dtmoban.Rows.Count];
//
for (int i = 0; i < dtmoban.Rows.Count; i++)
{
DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
}
//
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
//
int importRowNum = 0;
//
int importColNum = 0;
while (rows.MoveNext())
{
try
{
string FirstCellStr = ((HSSFRow)rows.Current).GetCell(0).ToString();
string SecondCellStr = ((HSSFRow)rows.Current).GetCell(1).ToString();
if (FirstCellStr == " " || FirstCellStr == " " || SecondCellStr == " ")
{
importRowNum = ((HSSFRow)rows.Current).RowNum + 1;
importColNum = ((HSSFRow)rows.Current).LastCellNum;
break;
}
}
catch (Exception ex)
{
continue;
}
}
// , DataTable
try
{
for (int j = 0; j < importColNum; j++)
{
dt.Columns.Add(" " + j.ToString());
}
}
catch (Exception)
{
return dt;
}
// rows.MoveNext(), Reset()
rows.Reset();
// 、 DataTable
while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
int currentRowNum = row.RowNum;
if (currentRowNum < importRowNum)
{
continue;
}
DataRow dr = dt.NewRow();
// DataTable i 1 DataType IsMust 1
ICell cellxh = row.GetCell(0); //
for (int i = 1; i < importColNum; i++)
{
ICell cell = row.GetCell(i);
// , ( ), ExcelImportException
if (cell == null && IsMust[i - 1] == "1")
{
//throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", " [" + cellxh.ToString() + "]", " [" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", " [ ]");
txtErrorInfo += sheet.SheetName + "| " + cellxh.ToString() + "| " + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "| \r
";
}//
else if (cell == null && IsMust[i - 1] != "1")
{
dr[i] = "";
}
else
{
string value = cell.ToString();
if (value=="")
{
txtErrorInfo += sheet.SheetName + "| " + cellxh.ToString() + "| " + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "| \r
";
}
string type = DataType[i - 1];
if (GetTypeNew(value, type) != true)
{
//throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", " [" + cellxh.ToString() + "]", " [" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", " [ " + DataType[i] + "]");
txtErrorInfo += sheet.SheetName + "| " + cellxh.ToString() + "| " + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "| " + DataType[i] + "\r
";
}
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
dt.Columns.RemoveAt(0); //
if (txtErrorInfo.Length> 9) // :\r
{
dt.Clear();
}
return dt;
}
4. .NetでButtonボタンをクリックしてクリックイベントを実行しない
この場合、Buttonボタンがあるページには2つ以上のFormラベルがある可能性があります.
5.会社のページング方法(二)
ページングするReapter、GridViewなどを配置できるユーザーコントロールが使用されています...
HTMLコードは次のとおりです.
<%@ Control Language="C#" AutoEventWireup="true" Inherits="controls_PageNavigator" Codebehind="PageNavigator.ascx.cs" %>
<asp:Label runat="server" ID="LblRecordCount"/> , <asp:Label runat="server" ID="LblPageCount"/> , <asp:Label runat="server" ID="LblPageIndex" />
<asp:LinkButton ID="LnkBtnFirst" runat="server" CommandName="Page" OnClick="LnkBtnFirst_Click" CssClass="list_link"> </asp:LinkButton>
<asp:LinkButton ID="LnkBtnPrevious" runat="server" CommandName="Page" OnClick="LnkBtnPrevious_Click" CssClass="list_link"> </asp:LinkButton>
<asp:LinkButton ID="LnkBtnNext" runat="server" CommandName="Page" OnClick="LnkBtnNext_Click" CssClass="list_link"> </asp:LinkButton>
<asp:LinkButton ID="LnkBtnLast" runat="server" CommandName="Page" OnClick="LnkBtnLast_Click" CssClass="list_link"> </asp:LinkButton>
<asp:textbox id="txtNewPageIndex" runat="server" width="20px" CssClass="form"/>
<asp:linkbutton id="LnkBtnGoto" runat="server" causesvalidation="False" commandargument="-1" commandname="Page" text="Go" OnClick="LnkBtnGoto_Click" CssClass="list_link" />
バックグラウンドコードは次のとおりです.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public delegate void PageChangeHandler(object send, int nPageIndex); //
public partial class controls_PageNavigator : System.Web.UI.UserControl
{
// , Page_Load , LnkBtnFirst_Click ,
public event PageChangeHandler OnPageChange;
private int _PageCount = 0;
private int _RecordCount = 0;
private int _PageIndex = 1;
protected void Page_Load(object sender, EventArgs e)
{
}
public int PageCount
{
get
{
return int.Parse(this.LblPageCount.Text);
}
set
{
_PageCount = value;
/*
if (_PageCount < 2)
{
//this.txtNewPageIndex.Enabled = false;
//this.LnkBtnGoto.Enabled = false;
}
else
{
//this.txtNewPageIndex.Enabled = true;
//this.LnkBtnGoto.Enabled = true;
}
*/
this.LblPageCount.Text = _PageCount.ToString();
}
}
public int RecordCount
{
get
{
return int.Parse(this.LblRecordCount.Text);
}
set
{
_RecordCount = value;
this.LblRecordCount.Text = _RecordCount.ToString();
}
}
public int PageIndex
{
get
{
return int.Parse(this.LblPageIndex.Text);
}
set
{
_PageIndex = value;
this.txtNewPageIndex.Text = this.LblPageIndex.Text = _PageIndex.ToString();
if (_PageIndex < 2)
{
this.LnkBtnFirst.Enabled = false;
this.LnkBtnPrevious.Enabled = false;
}
else
{
this.LnkBtnFirst.Enabled = true;
this.LnkBtnPrevious.Enabled = true;
}
if (_PageIndex >= _PageCount)
{
this.LnkBtnNext.Enabled = false;
this.LnkBtnLast.Enabled = false;
}
else
{
this.LnkBtnNext.Enabled = true;
this.LnkBtnLast.Enabled = true;
}
}
}
protected void LnkBtnFirst_Click(object sender, EventArgs e)
{
try
{
OnPageChange(sender, 1);
}
catch { }
}
protected void LnkBtnPrevious_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageIndex.Text);
n--;
OnPageChange(sender, n);
}
catch
{
throw;
}
}
protected void LnkBtnNext_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageIndex.Text);
n++;
OnPageChange(sender, n);
}
catch
{
throw;
}
}
protected void LnkBtnLast_Click(object sender, EventArgs e)
{
try
{
int n = Convert.ToInt32(this.LblPageCount.Text);
OnPageChange(sender, n);
}
catch
{
throw;
}
}
protected void LnkBtnGoto_Click(object sender, EventArgs e)
{
int n;
try
{
n = Convert.ToInt32(this.txtNewPageIndex.Text);
}
catch
{
n = Convert.ToInt32(this.LblPageIndex.Text);
}
int np = Convert.ToInt32(this.LblPageCount.Text.Trim());
if (n > np)
n = np;
if (n < 1)
n = 1;
OnPageChange(sender, n);
}
}
PageNavigatorページのバックグラウンド・コードは次のとおりです.
protected void Page_Load(object sender, EventArgs e)
{
this.PageNavigator1.OnPageChange += new PageChangeHandler(PageNavigator1_OnPageChange);
if (!Page.IsPostBack)
{
DataListBind(1);
}
}
void PageNavigator1_OnPageChange(object send, int nPageIndex)
{
DataListBind(nPageIndex);
}
private void DataListBind(int PageIndex)
{
int nRCount, nPCount;
// DataTable
string SqlAllFields="id,name,age,sex"; //
string SqlTablesAndWhere="tablename where **"; // where
string IndexField="id"; //
string OrderFields="order by id desc"; //
DataTable dt = GetPage(SqlAllFields,SqlTablesAndWhere,IndexField,OrderFields,PageIndex, 20, out nRCount, out nPCount);
this.PageNavigator1.PageCount = nPCount;
this.PageNavigator1.PageIndex = PageIndex;
this.PageNavigator1.RecordCount = nRCount;
this.Repeater1.DataSource = dt;
this.Repeater1.DataBind();
dt.Clear();
dt.Dispose();
}
上記のGetPageメソッドは次のとおりです.
public DataTable GetPage(string sqlallfields,string sqltablesandwhere ,string indexfield,string orderfields,int PageIndex, int PageSize, out int RecordCount, out int PageCount)
{
string Sql = GetPageSql(SqlAllFields, SqlTablesAndWhere, IndexField, OrderFields, PageIndex, PageSize, out RecordCount, out PageCount);
// sql DataTable
}
上のFetPageSqlの方法は以下の通りです.
private string GetPageSql(string SqlAllFields, string SqlTablesAndWhere, string IndexField, string OrderFields, int PageIndex, int PageSize, out int RecordCount, out int PageCount)
{
RecordCount = 0;
PageCount = 0;
if (PageSize <= 0)
{
PageSize = 10;
}
string SqlCount = "select count(" + IndexField + ") from " + SqlTablesAndWhere;
RecordCount = SqlCount ;
if (RecordCount % PageSize == 0)
{
PageCount = RecordCount / PageSize;
}
else
{
PageCount = RecordCount / PageSize + 1;
}
if (PageIndex > PageCount)
PageIndex = PageCount;
if (PageIndex < 1)
PageIndex = 1;
string Sql = null;
if (PageIndex == 1)
{
Sql = "select top " + PageSize + " " + SqlAllFields + " from " + SqlTablesAndWhere + " " + OrderFields;
}
else
{
Sql = "select top " + PageSize + " " + SqlAllFields + " from ";
if (SqlTablesAndWhere.ToLower().IndexOf(" where ") > 0)
{
string _where = Regex.Replace(SqlTablesAndWhere, @"\ where\ ", " where (", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Sql += _where + ") and (";
}
else
{
Sql += SqlTablesAndWhere + " where (";
}
Sql += IndexField + " not in (select top " + (PageIndex - 1) * PageSize + " " + IndexField + " from " + SqlTablesAndWhere + " " + OrderFields;
Sql += ")) " + OrderFields;
}
return Sql;
}