Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
右键点 Microsoft Visual SourceSafe 启动的快捷方式,属性,修改目标栏
右键点 Microsoft Visual SourceSafe 启动的快捷方式,属性,修改目标栏
1,传参与调用:
?SqlParameter[] storedParams = {
????????????????????????????????????????????? new SqlParameter(“@TranType”, “INSERT”),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@RoleName”, _RoleEntity.RoleName),
????????????????????????????????????????????? new SqlParameter(“@description”, _RoleEntity.Description),
????????????????????????????????????????????? new SqlParameter(“@CreateBy”, _RoleEntity.CreateBy),
????????????????????????????????????????????? new SqlParameter(“@isValid”, _RoleEntity.IsValid),
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? new SqlParameter(“@isSystem”, _RoleEntity.IsSystem),???????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????? //new SqlParameter(“@LastEditBy”, _RoleEntity.LastEditBy),
?????????????????????????????????????????????
????????????????????????????????????????? };
??????????????? _RoleEntity.ID = int.Parse(SqlHelper.ExecuteScalar(HelpConstant.DBCONN_STRING,
??????????????????? CommandType.StoredProcedure,?????? //指定按存储过程执行
??????????????????? “frmRole_save”,?????????????????????????????? //存储过程名称
??????????????????? storedParams).ToString());
传的参数小于等于存储过程指定的参数个数,不能有存储过程不存在的参数。
2,存储过程技巧
????? 1,AND OrderNo LIKE ISNULL(@OrderNo, ”) + ‘%’? // 有则查,无查全部
????? 2, AND CONVERT(varchar(10), OrderDate, 20) =, //AND 语句中加入选择!
??? ??? CASE(ISNULL(@OrderDate, ”))
??? ??? ??? WHEN ” THEN? CONVERT(varchar(10), OrderDate, 20)
??? ??? ??? ELSE @OrderDate END
上面的可直接换成下面方式:先计算出值再查询
?IF ( @CustomerName IS NULL )
??? BEGIN
??? ??? SET @CustomerName = ”
??? END
?IF ( @ShipDateEnd IS NULL OR @ShipDateEnd = ” )
??? BEGIN
??? ??? SET @ShipDateEnd = ‘2999-01-01′
??? END???
3, 右连接对指定的条件进行聚合
SELECT DISTINCT ACCOUNT, a.departmentid,sum(a.amount) as amount FROM bdOrder a
RIGHT JOIN permUserDepartment p
on a.SalesStaff = p.Account
AND a.orderstatus = ’07’
where?? a.DepartmentID is null or a.DepartmentID IN (SELECT DepartmentID FROM permUserDepartment(NOLOCK)??? WHERE Account = ‘sa’)? — 销售部门
group by account,a.departmentid
order by account,a.departmentid
1,aspx文件:
<asp:UpdatePanel ID=”UpdatePanel2″ runat=”server”>
??????????????????????? <ContentTemplate>
??????????????????????????? <asp:TextBox ID=”txtModel” Text=”” runat=”server” Width=”130px” CssClass=”MustInputText”></asp:TextBox>
?????????????????????????? <asp:Panel CssClass=”ContainPanel” ID=”Panel2″ runat=”server”? Width=”130px”
??????????????????????????????? Style=”visibility: hidden” >
??????????????????????????????? <asp:GridView ID=”gdModel” runat=”server” ShowHeader=”False” BorderWidth=”0px” OnRowCreated=”gdModel_RowCreated”>
??????????????????????????????? </asp:GridView> //当可选时用GridView获取数据库数据,用来显示下拉框
??????????????????????????? </asp:Panel>
??????????????????????????
??????????????????????????? <cc1:DropDownExtender ID=”DropDownExtender2″ runat=”server” DropDownControlID=”Panel2″
??????????????????????????????? TargetControlID=”txtModel” Enabled=”true”>
??????????????????????????? </cc1:DropDownExtender>
??????????????????????????? <cc1:AutoCompleteExtender ID=”AutoCompleteExtender3″ runat=”server” TargetControlID=”txtModel”? CompletionInterval=”100″? //触发时间
??????????????????????????????? CompletionSetCount=”10″ EnableCaching=”true” MinimumPrefixLength=”1″ ServiceMethod=”GetModelList1″
??????????????????????????????? ServicePath=”~/WebService/AutoCompleteService.asmx”>
??????????????????????????? </cc1:AutoCompleteExtender>? //AutoComplete用来自动填充功能
??????????????????????? </ContentTemplate>
??????????????????? </asp:UpdatePanel>
注:DropDownExtender :用来在下拉时填充。主要是为TxtBox增加下拉功能,显示的内容来自 DropDownControlID, DropDownControlID用来指向用什么块显示,TargetControlID用来指向哪个控件触发,事件为点击。
?????? AutoCompleteExtender :用来输入时自动带出数据库中的相关提示。TargetControlID指向哪个控件触发,事件为输入。当输入时,调用webservice,执行ServiceMethod方法,返回string[]数组,用来显示下拉的内容如:
public string[] GetModelList1(string prefixText, int count)??????? //prefixText名称保持不变
??? {
??????? ProductBL _ProductBL = new ProductBL();
??????? SqlDataReader dr = _ProductBL.GetModelsByCategory(“乐知购”);
??????? DataTable dt = new DataTable();
??????? dt.Load( dr );
??????? List<String> Models = new List<string>(dt.Rows.Count);
??????? for (int i = 0; i < dt.Rows.Count; i++)
??????? {
??????????? Models.Add(dt.Rows[i][“Model”].ToString());
??????? }
??????? List<String> returnlist = new List<string>();
??????? foreach( string s in Models ){
??????????? if ( s.IndexOf(prefixText)!= -1 ){
??????????????? returnlist.Add(s);
??????????? }
??????? }
???????
??????
??????? return returnlist.ToArray();
??? }
注:(1)要想用此控件,要引入AjaxControlToolkit.dll
?????? (2)页面上放置: <asp:ScriptManager ID=”ScriptManager1″ runat=”server”>? </asp:ScriptManager>
2, 两个控件都启作用时会乱,一般进行控制,当一定条件时enabled = false;
DateTime.Now.ToString(“yyyy-MM-dd”);??????????????? //2009-08-14
DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss”); //2009-08-14 15:57:12″ToString 按指定形式转换 DateTime.Now.ToString(“aaaaa”) ; 输出aaaaa 除非在参数中指定了特定的格式。如:
年:yyyy 2009, yyy 2009, yy 09, y 9
月: MM 08 (不是mm的原因是mm代表时间中的分钟)
日:dd: 14
时:HH: 16 (以24小时制) hh:04 (12小时制)
分:mm
秒:ss即时间控制都用小写,除非是重合的MM与mm, 及小时。
//2009年09月18 17时55分48秒
? System.DateTime.Now.ToString(“yyyy年MM月dd HH时mm分ss秒”);??? 12345.ToString(“n”); //生成 12,345.00
??? 12345.ToString(“C”); //生成 ¥12,345.00
??? 12345.ToString(“p”); “1,234,500.00%”
DataAdapter:? 获取数据库中的数据
DataSet, SqlDateReader, DataTable存储DataAdapter得来的数据。
1,通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
??? SqlDataAdapter da = new SqlDataAdapter(cmd);
??? DataSet ds = new DataSet(); da.Fill(ds);
2, SqlDataReader的创建必须调用 SqlCommand 对象的 ExecuteReader方法,而不是用new
DataSet与DataReader区别:
3,DataSet, DataReader数据的读取
??? (1)
????? DataSet利用DataTable读取
???????? DataTable dt =DataSet1Tables[0];
????????
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? Console.wirte(row[“Name”] );
??????????? }
??? (2)
? ? ?? MySqlDataReader dr = _newsDA.GetData(1, 3, 0);
???????? while (dr.Read()){
? ? ? ? ? ? Console.wirte(dr[“Name”]);
???????????????????????? // 或者dr[“0”], dr.GetInt32(0);指定类型返回
???? }?
???? (3)
? ? ?? DataReader也可用DataTable读取
???? ? DataTable dt = new DataTable();
?????? dt.Load( DataReader1 );
???? load:用DataReader数据源的值填充 DataTable。如果 DataTable 已经包含行,则从数据源传入的数据将与现有的行合并。
4, DataTable 与 DataView
利用DataView可对数据进行排序,筛选,并保存结果视图。
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
5, GridView 的DataSource 可以是DataSet, DataReader, DataTable, DataView
1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);
加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序
//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。
3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);
4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;
按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);
两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;
DISTINCT
DataTable dataTable;
DataView dataView = dataTable.DefaultView;
DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);
//注:其中ToTable()的第一个参数为是否DISTINCT
1,DataTable dt = GetData(iPageSize, iPageIndex).Tables[0];? //GetData(iPageSize, iPageIndex)返回DataSet
? dt.Columns.Add(“Detail”);? //增加栏位? 注意的一点是dt的列名大小写不敏感,源于sql语句大小写不敏感
??????????? foreach (DataRow row in dt.Rows)
??????????? {
??????????????? row[“Detail”] =”123″
??????????? }
??????????? return dt;
GridView1DataSource = dt;? //gridview datasource可以是dataset, 也可以是datatable
? //dt.Columns.Add(“Detail”); Detail默认为string类型,指定类型可用:
? ? ?? DataColumn column = new DataColumn(“pageBy”);
??????? column.DataType = System.Type.GetType(“System.Int32”);
??????? column.AutoIncrement = true;
??????? column.AutoIncrementSeed = 0;
??????? column.AutoIncrementStep = 1;
?????? column.DefaultValue = 0;
??????? dt.Columns.Add(column);
加列
?DataRow srow = dt.NewRow();
??????????????? row[“OrderStatus”] = row[“OrderStatus”].ToString();
??????????????? row[“OrderNums”] = 1;
??????????????? row[“OrderAmounts”] = row[“Amount”].ToString();
?????????????? sdt.Rows.Add(srow);
2,排序
?DataView DV = dt.DefaultView;
?DV.Sort = “department, amount desc”;
//排序时注意的一点是列的类型,如amount若是string型,就不会按数字排序
//datatable是内存中的表,这个表可以增加,删除,update记录的,而dataview只是相当于视图,基本上是用来显示数据的,? 用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
?执行聚合函数:如sum,count
dt.Compute(“Sum(Total)”, “EmpID = 5”);
dt.Compute(“Sum(fenshu)”,”1=1″);?
注意没有count(*) count(1) 要指定具体的列
Sum(expression)中expression要注意的是:
1,expression这个参数中的列名不能是数字开头,否则就会报这个错。(这个很难排查出来。。。)
2,expression参数中字段的数据类型问题,例如Sum(字符类型)就会报这个错。
3,查询,取部分数据集
?? ?string expression = “Date > ‘1/1/00′”;
?? ?string sortOrder = “CompanyName DESC”;
?? ?DataRow[] foundRows = table.Select(expression, sortOrder); //查询带排序
?? (1)取部分行
?DataView davTemp = new DataView(datSource, “过滤条件”, “排序字段”, DataViewRowState.各种 状态);
//把过滤后的表赋给新表
DataTable datNew = davTemp.ToTable();
(2)取部分列
DataTable dat = YourDataTable.DefaultView.ToTable(false, new string[] { “你要的列名”, “你要的列名” });
false : 不去掉重复行
(3)删除列
YourDataTable.Columns.Remove(“列名”);
4,设主键
?? DataTable dt = new DataTable();
??????? dt.Columns.Add(“id”);
??????? dt.Columns.Add(“PartName”);
??????? dt.Columns.Add(“Style”);
??????? dt.Columns.Add(“quantity”);
??????? dt.Columns.Add(“Unit”);
??????? DataColumn dc1 = new DataColumn(“Amount”,typeof(float));
??????? dtAll.Columns.Add(dc1);
??????? //增加主键
??????? DataColumn[] columns = new DataColumn[2];
??????? columns[0] = dt.Columns[“id”];
??????? columns[1] = dt.Columns[“Style”];
??????? dt.PrimaryKey = columns;
按主键查询:
? object[] findTheseVals = new object[2];
?? findTheseVals[0] = id;
?? findTheseVals[1] = Style;
?? DataRow dr = dt.Rows.Find(findTheseVals);
两个DataTable合并: merge
dt1.Merge(dt2,true);
//true指示当dt2存在与dt1相同的主键值时dt1是否不修改,当为false时用dt2更新dt1, 要牢记的是同一个table中主键必须要保持唯一,若只想两个table简单的合在一起,那要在merge之前将两个DataTable的主键去掉,如:dt1.PrimaryKey = null;
DISTINCT
DataTable dataTable;
DataView dataView = dataTable.DefaultView;
DataTable dataTableDistinct = dataView.ToTable(true,”FieldName1″,”FieldName2″,”…”);
//注:其中ToTable()的第一个参数为是否DISTINCT
原理:在DataTable中构造一个pageBy 自增字段,, 根据页面传来的值查出当前行对应的pageBy,那么减1就是上一条,加1就是上一条, 实际是为DataTable的Row实现索引。
1,构造索引:pageBy
DataTable pd = dt.Clone(); //dt为数据表
DataColumn column = new DataColumn("pageBy");
column.DataType = System.Type.GetType("System.Int32");
column.AutoIncrement = true;
column.AutoIncrementSeed = 1;
column.AutoIncrementStep = 1;
pd.Columns.Add(column);
DataColumn[] columns = new DataColumn[1];
columns[0] = column;
pd.PrimaryKey = columns;
foreach (DataRow dr in dt.Rows) {
pd.ImportRow(dr); //引入数据
}
Session["pageData"] = pd; //存入Session中,以便查询
2,列表页面传来选中行的实际id, 查出pageBy
DataTable dt = (DataTable)Session["pageData"];
DataRow[] drs = new DataRow[1];
drs = dt.Select("id=" + allocateid); //根据页面传来的id查出pageBy
if (drs.Length > 0)
{
int pageIndex = int.Parse(drs[0]["pageBy"].ToString());
//上一页Callback.aspx?allocateid=226&customerid=67
drs = dt.Select("pageBy=" + (pageIndex -1).ToString() );
if (drs.Length <= 0)
{
hlPrevious.Text = "上一条:没有了";
}
else {
hlPrevious.Text = "上一条:" + drs[0]["CustomerName"].ToString();
hlPrevious.NavigateUrl = "Callback.aspx?allocateid=" + drs[0]["id"] + "&customerid=" + drs[0]["CustomerID"];
}
//下一页
drs = dt.Select("pageBy=" + (pageIndex + 1).ToString());
if (drs.Length <= 0)
{
hlNext.Text = "下一条:没有了";
}
else
{
hlNext.Text = "下一条:" + drs[0]["CustomerName"].ToString();
hlNext.NavigateUrl = "Callback.aspx?allocateid=" + drs[0]["id"] + "&customerid=" + drs[0]["CustomerID"];
}
<% # Eval(“Name”) %>
<% # Bind(“Name”) %>
eval:。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,等同于:DataBinder.Eval(Container.DataItem, “Address”)
方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法
Eval?方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。、Bind?方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。
比较:
<asp:LinkButton ID=”lbnReturnToday” runat=”server”
Enabled? = ‘<%#? Eval( “account” ).Equals(“lichong”)?false:true %>’ CommandName=”returnAllocateToday” CommandArgument='<%# Eval(“account”) %>’>回收当天分配</asp:LinkButton>
1, <asp:HyperLinkField DataTextField="CustomerName" DataNavigateUrlFields="id,CustomerName" DataNavigateUrlFormatString="~/Customer/CustomerDetail.aspx?CustomerID={0}&CustomerName={1}" HeaderText="顾客姓名" /> 生成带超连接的一行信息, id, CustomerName为数据源中的字段,它们将分别填充到{0},{1}位置,DataTextField:指定链接显示的字段 带修改之类的可加button <asp:LinkButton ID="lbtnEdit" runat="server" Text="修改" CommandName="Edit" CommandArgument='<%# Eval("orderno") %>'> </asp:LinkButton> CommandName 为要执行的方法。
2,LinkButton 传多个参数: <asp:TemplateField HeaderText="销售人员" ItemStyle-HorizontalAlign="Left" ItemStyle-Width="12%"> <ItemTemplate> <asp:LinkButton ID="lbtnCConfirm" runat="server" Text='<%# Eval("SalesStaff") %>' CommandName="StaffShow" CommandArgument=<%# Eval("id")+","+Eval("SalesStaff") %> > </asp:LinkButton> </ItemTemplate> </asp:TemplateField> <asp:Button ID="btnSave" runat="server" Text="保存" CssClass="btn2" /> 后台在gvTotal_RowCommand方法中通过e.CommandArgument.ToString().Split(',')来分开。 asp:Button 与上类似,若想用CommandArgument传参,可在其onCommand中接收,而不是在onClick事件中。 利用onCommand的原因是:页面中有许多button,想在同一个方法中处理其点击事件,可令每个按纽的onCommnad指向同一个方法,并设置CommandArgument参数,这样在onCommnad中就可依据此参数来对不同的按纽做相应的操作,达到集中处理的目的。 注:若是在GridView中,多个onCommand可指向同一个自定义事件,或者利用GridView提供的gvTotal_RowCommand方法也可,其实是同一个。 Eval: CommandArgument=<%# Eval("OrderNo") + "," + Container.DataItemIndex %> /> DataItemIndex 传当前行号 注:HyperLink传参为: <asp:HyperLink ID="hlDetail" runat="server" NavigateUrl='<%# "followhistoryrecord.aspx?allocateid="+ Eval("id")%>'>明细..</asp:HyperLink>
3, 利用TemplateField引用非数据源控件 (1) <asp:GridView ID="gdCancel" runat="server" AutoGenerateColumns="False" CssClass="grid" onrowcreated="gdCancel_RowCreated" DataKeyNames="id" Height="80%"> <HeaderStyle CssClass="gridHeader"></HeaderStyle> <RowStyle CssClass="gridItem" /> <Columns> <asp:TemplateField HeaderText="选择" > <ItemStyle Width="25%" HorizontalAlign="Center" /> <ItemTemplate> <asp:CheckBox ID="chkItem" runat="server" onclick="Select(this);"/> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> 注:也可加在标题处 <asp:TemplateField ItemStyle-BorderColor="Black" ItemStyle-BorderWidth="1" HeaderStyle-BorderWidth="1" HeaderStyle-BorderColor="Black"> <ItemStyle Width="5%" HorizontalAlign="Center" /> <HeaderTemplate> <%– <input type="checkbox" id="chkAll1" onclick="CheckAll( this );" />–%> 选择 </HeaderTemplate> <ItemTemplate > <asp:CheckBox ID="chkItem" runat="server" /> </ItemTemplate> </asp:TemplateField>. /*选择所有 checkbox */ function CheckAll(chkAll) { var obj = document.aspnetForm.getElementsByTagName("input"); // var chck1 = document.getElementById( "chkAll1" ); // var chck2 = document.getElementById( "chkAll2" ); // chck1.checked = chkAll.checked; // chck2.checked = chck1.checked; for (var i=0;i<obj.length;i++) { var e = obj[i]; if (e.id.indexOf("chkItem")>=0 && e.type=="checkbox") e.checked = chkAll.checked; } } (2) 在类文件中操作此控件可用: CheckBox ck = (CheckBox)gdCancel.Rows[i].FindControl("chkItem"); 得到每行数据的主键可用:gdCancel.DataKeys[i].Value.ToString()) DataKeys 用DataKeyNames指定 (3) //遍历 foreach (GridViewRow vr in gdCustomer.Rows) { foreach( TableCell tc in vr.Cells ){ Console.Write(tc.Text); //此时的Cell为控件,可设置背景等属性 } } } //GridView只是一个数据显示控件,不是数据存储控件如:DataSet,故它可抓取的数据是它所能显示的数据。 (4) 获取当前行的数据: if (e.Row.RowType == DataControlRowType.DataRow) { //e:GridViewRowEventArgs gdCancel.Rows[gdCancel.SelectedIndex].Cells[1].Text } 注:DataControlRowType:数据控件中行的类型,只有DataRow才会有数据 Header 数据控件的标题行。标题行不能绑定数据。 Footer 数据控件的脚注行。脚注行不能绑定数据。 DataRow 数据控件的数据行。只有 DataRow 行能绑定数据。 Separator 行分隔符。行分隔符不能绑定数据。 Pager 显示页按钮或页导航控件的行。页导航行不能绑定数据。 EmptyDataRow 显示页按钮或页导航控件的行。页导航行不能绑定数据。
4, 为行增加动作。如鼠标经过时变色: protected void gdCancel_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;d=this.style.color;this.style.backgroundColor='#348E37';this.style.color='#ffffff';"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c;this.style.color=d;"); //e.Row.Attributes.Add("style", "background-color:red"); } }
5,根据逻辑在数据绑定时做一些事情 protected void gdCustomer_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { LinkButton lbtnEdit = (LinkButton)e.Row.FindControl("lbtnEdit"); if (OperateType == "FIRST" && ddlCustomerType.SelectedItem.Value.Trim().IndexOf("distribute") < 0) { lbtnEdit.Enabled = false; } } } 注:在页面级处理的方法为:<%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部 "%> 控制日期显示长度:<%# DataBinder.Eval(Container.DataItem, "OrderDate", "{0:yyyy-MM-dd}")%> 等同于<% # Eval(“OrderDate”, “{0:yyyy-MM-dd}” ) %> 控制字符串长度 <ItemStyle HorizontalAlign="Left" Width="15%"></ItemStyle> <ItemTemplate> <%# MySubString(DataBinder.Eval(Container.DataItem, "Address"),10)%> </ItemTemplate> </asp:TemplateField> 在程序中定义MySubString方法进行处理 <%# DataBinder.Eval(Container.DataItem, "DepartmentId").ToString() == "6" ? "增值服务部" : "客户发展部 "%> 等同于<%# Eval("DepartmentId")%> 控制字段显示与否 gdCustomer.Columns[8].Visible = false;
6,GridView存额外数据,以备后用 当数据源绑定GridView时提供的数据只是GridView用DataField,或Eval指定的数据,若想存其它数据变通的方法是: <asp:TemplateField HeaderText="广告来源"> <ItemStyle Width="10%"></ItemStyle> <ItemTemplate> <asp:HiddenField Value=<%# Eval( "ADSource" ) %> runat=server ID="ADSource"/> <asp:DropDownList ID="ddlADSource" runat="server"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> 利用HiddenField存储数据, 在程序中通过((HiddenField)e.Row.FindControl("ADSource")).Value 来得到数据。 注:指定一BoundField,将其Visible设为false的方式是不行的,不会存储起数据。
7, 分页 GridView在分页状态下显示的数据条数为pagesize,而不是整个数据
8,根据逻辑显示若隐藏一列:dgOrder.Columns[9].Visible = false;隐藏之后无论查询的数据集中有没有相应的字段,都不会出错。 即:当将GridView的某一数据感应控件设为Visible之后,此控件将不参与GridView的DataBind方法。
9,编辑更新数据 (1)在gridview:AutoGenerateEditButton="True" 会自动生成编辑按纽,点编辑之后会将一行变成txtbox可编辑状态,编辑按纽变成取消与更新两个按纽,要添加相应的事件 //自动产生的按纽格式不要调整,可将AutoGenerateEditButton="False",同样为gridview增加OnRowEditing,OnRowCancelingEdit,OnRowUpdating事件,同时在每一行中增加<asp:TemplateField><ItemTemplate><asp:LinkButtonID="btnEdit" runat="server" CommandName="Edit" Text="修改" /> <asp:LinkButtonID="btnSave" runat="server" CommandName="Update" Text="保存" /></ItemTemplate></asp:TemplateField> 只要CommandName为对应的edit,update,cancel那么它们就会自动调用相应的 OnRowEditing,OnRowCancelingEdit,OnRowUpdating方法,同自动产生的按纽一样,不过更加灵活!
10, OnClientClick传值时要将js函数写在Eval内: OnClientClick='<%# Eval("name","alert(\"{0}\")") %>' > protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e) { //编辑 gdCustomer.EditIndex = e.NewEditIndex; BindGrid(); } protected void gdCustomer_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { //取消编辑状态 gdCustomer.EditIndex = -1; BindGrid(); } protected void gdCustomer_RowUpdating(object sender, GridViewUpdateEventArgs e) { //更新 sqlcon = new SqlConnection(strCon); string sqlstr = "update 表 set 字段1='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',字段2='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',字段3='" + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where id='" + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'"; sqlcom=new SqlCommand(sqlstr,sqlcon); sqlcon.Open(); sqlcom.ExecuteNonQuery(); sqlcon.Close(); gdCustomer.EditIndex = -1; BindGrid(); } 注:若想指定某几行不可编辑可采用如下方式: (1)对指定的不可编辑的行做处理 protected void gdCustomer_RowDataBount(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if ("回访完毕".Equals(e.Row.Cells[2].Text)) { e.Row.Attributes.Add("disabled", "true"); //disabled这个属性会将一行设置成灰色 } } } (2)获取处理的方式: protected void gdCustomer_RowEditing(object sender, GridViewEditEventArgs e) { foreach (string s in gdCustomer.Rows[e.NewEditIndex].Attributes.Keys) { if ("disabled".Equals(s)) { return; } } gdCustomer.EditIndex = e.NewEditIndex; BindGrid(); }
11. 加汇总 1)指定显示foot (ShowFooter="true" ),2)计算汇总数据
12 空数据时显示提示-EmptyDataText属性
dgOrder.EmptyDataText = string.Format("{0}不存在!", txtPackageNo.Text.Trim());
1,aspx是界面,其上控件可直接在.aspx.cs上直接用,前提是有 runat=”server”
如:
如:txtCustomer.value = “asong”
2, .cs内编写的函数可直接在aspx上应用。如.cs有一个取格式化数据的方法,FormatingStr, 则可在界面上用如下方式:
<%# FormatString(Eval("customer"), 4)%>:
1,可将通用代码提取,生成一个userControl, 在别的页面使用时直接拖入即可。
项目–添加新项项–web用户控件 , 在代码插入其中,在其它页面使用。
2,如有一个订单模块,要在多个页面中存在,可提取放入order.ascx之中,同时在其order.ascx.cs中编写插入功能,
这样在其它页面中只需简单的拖动,即可实现下单功能。
例:
在a页面中引入:
当页面载入时,也会载入 uc2的Page_Load事件
或者在A.cs 中指定要调用的方法并传参。 OrderTrace1.OrderNo = “123”; OrderTrace1.InitForm(); 完成参数在页面及userControl之间的共享!
.Net 2中5个数据源控件,GridView,DataList,Repeator ,DetailsView,FormView其中前3个用于呈现多列数据,后面2个用于呈现单列数据,即常用的数据明细.
griview优点:功能最强大,提供分页,编辑,删除,选择等等很多功能,使用最方便,直接拖拽到页面上,建立新的数据源,点几下鼠标就可以维护一个表的浏览、删除和修改了,而且是分页
缺点:占用系统资源大,他的分页是把整个表的数据取出来,到gridview上分页的,因此如果数据量比较大的时候,速度非常非常慢。效率极低。
综合以上考虑:gridview适合数据量小,效率要求不高的情况使用,比如后台。
repeater优点:功能简单,效率高,容易灵活控制生成的HTML代码,分页需要自己实现,整体来说,如果用习惯repeater就会喜欢上,适合前台使用。
缺点:功能简单。需要自己做更多的事情才能完成某个功能。
datalist:介于上面两者之间。
1,界面:asp:Repeater用来重复执行,它有一个DataSource属性,可在onLoad时编码从数据库中取值,返回一个DataSet赋给此属性。完成数据的获取。
repeater1.DataSource = _consultingBL.GetData(SortId, gvPager.PageSize, gvPager.PageIndex);
在界面中显示数据库的值可用:<%# Eval("problem")%> problem为表中字段。
<%# FormatString(Eval("customer"), 4)%>:
<%# Eval("problem")%>
<%# FormatString(Eval("expert"), 16)%>:
<%# Eval("answer")%>
? <asp:Button ID=”Button1″ runat=”server” Text=”提交” onclick=”Button1_Click”
??????????????????? OnClientClick=”return confirm(‘Ok to post?’)”? />onclick 在服务端执行
onclientclick 在客户端执行
ctrl + k ctrl + f
1.? 使用QueryString变量
QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
??? string s_url;
??? s_url = “b.aspx?name=” + Label1.Text;
??? Response.Redirect(s_url);
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
??? Label2.Text = Request.QueryString[“name”];
}
2.? 使用Application 对象变量
Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
??? Application[“name”] = Label1.Text;
??? Server.Transfer(“b.aspx”);
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
??? string name;
??? Application.Lock();
??? name = Application[“name”].ToString();
??? Application.UnLock();
}
3.? 使用Session变量
想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
??? Session[“name”] = Label.Text;
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
??? string name;
??? name = Session[“name”].ToString();
}
4.? 使用Cookie对象变量
这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
??? HttpCookie cookie_name = new HttpCookie(“name”);
??? cookie_name.Value = Label1.Text;
??? Reponse.AppendCookie(cookie_name);
??? Server.Transfer(“b.aspx”);
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
??? string name;
??? name = Request.Cookie[“name”].Value.ToString();
}
5.? 使用Server.Transfer方法
这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。
a.aspx的C#代码
public string Name
{
??? get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
??? Server.Transfer(“b.aspx”);
}
b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
??? a newWeb;? //实例a窗体
??? newWeb = (source)Context.Handler;
??? string name;
??? name = newWeb.Name;
}
网页保存的时候若名字是中文,则下载到本地会因中文名称引用路径问题引起css不能读取,所以若默认是中文最好调到字母
用perfmon分析知,是磁盘读写拖慢了速度, 磁盘的读写操作是最费资源的操作之一,SQL Server 在内存中生成一个缓冲池来存放从数据库读取的页,可以加大通过加大内存,存放更多的缓冲数据来减少对磁盘的读写。
??? 1,增大虚拟内存:系统属性 – 高级 -性能 设置 – 高级 – 虚拟内存 更改:最大与最小设为物理内存的1.5倍
???? 2, SQL SERVER2005在32位上最大支持4GB,在数据库属性上开AWE,以支持更多内存。
?LIKE ‘%ASFD%’ 将执行全表扫描,速度低下,利用全表扫描解决
若存储过程执行timeout,则利用sql语句拼接方式!
?这是因为有些代码不符合w3规范引起的,去掉头部即可解决。
或者写符合w3规范的代码:将代码放到http://validator.w3.org/检测下,不符合规范的做出相应修改。
DOCTYPE声明对JS获取窗口宽度和高度的影响:
var control = document.body.scrollTop?document.body:document.documentElement;
然后用control.scrollTop与control.scrollLeft