c#的一些技巧

c#的一些技巧 
1.怎样定制VC#DataGrid列标题?  
DataGridTableStyle dgts = new DataGridTableStyle();  
dgts.MappingName = "myTable"; //myTable为要载入数据的DataTable  
DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn();  
dgcs.MappingName = "title_id";  dgcs.HeaderText = "标题ID";  
dgts.GridColumnStyles.Add(dgcs);       
。。。  
dataGrid1.TableStyles.Add(dgts);  

2.检索某个字段为空的所有记录的条件语句怎么写?  
...where col_name is null  

3.如何在c# Winform应用中接收回车键输入?  
设一下form的AcceptButton.  

4.比如Oracle中的NUMBER(15),在Sql Server中应是什么? 
 NUMBER(15):用numeric,精度15试试。 

 5.sql server的应用like语句的存储过程怎样写?  
select * from mytable where haoma like ‘%’ + @hao + ‘%’ 

 6.vc# winform中如何让textBox接受回车键消息(假没没有按钮的情况下)? 
 private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)   {    
 if(e.KeyChar != (char)13)
       return;     
else    //do something; 
 } 

 7.为什么(Int32)cmd.ExecuteScalar()赋值给Int32变量时提示转换无效? 
 Int32.Parse(cmd.ExecuteScalar().ToString()); 

 8.DataSource为子表的DataGrid里怎样增加一个列以显示母表中的某个字段?  在子表里手动添加一个列。  DataColumn dc = new DataColumn("newCol", Type.GetType("System.String");  dc.Expression = "Parent.parentColumnName";  dt.Columns.Add(dc); //dt为子表  

9.怎样使DataGrid显示DataTable中某列的数据时只显示某一部分?
  select ..., SUBSTR(string, start_index, end_index) as ***, *** from ***  

10.如何让winform的combobox只能选不能输入? 
 DropDownStyle 属性确定用户能否在文本部分中输入新值以及列表部分是否总显示。 
 值:  DropDown --- 文本部分可编辑。用户必须单击箭头按钮来显示列表部分。  
 DropDownList --- 用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。   
Simple --- 文本部分可编辑。列表部分总可见。  

11.怎样使winform的DataGrid里显示的日期只显示年月日部分,去掉时间?  
sql语句里加上to_date(日期字段,'yyyy-mm-dd')  

12.怎样把数据库表的二个列合并成一个列Fill进DataSet里?  
dcChehao = new DataColumn("newColumnName", typeof(string));  dcChehao.Expression = "columnName1+columnName2";  dt.Columns.Add(dcChehao);  Oracle:  select col1||col2 from table   sql server:  select col1+col2 from table  

13.如何从合并后的字段里提取出括号内的文字作为DataGrid或其它绑定控件的显示内容?即把合并后的字段内容里的左括号(和右括号)之间的文字提取出来。
  Select COL1,COL2, case   when COL3 like ‘%(%’ THEN substr(COL3, INSTR(COL3, ‘(’ +1, INSTR(COL3,‘)’)-INSTR(COL3,‘(’)-1)  end as COL3  from MY_TABLE 

 14.当用鼠标滚轮浏览DataGrid数据超过一定范围DataGrid会失去焦点。怎样解决?
  this.dataGrid1.MouseWheel+=new MouseEventHandler(dataGrid1_MouseWheel);   private void dataGrid1_MouseWheel(object sender, MouseEventArgs e)   {     this.dataGrid1.Select();   } 

 15.怎样把键盘输入的‘+’符号变成‘A’?  textBox的KeyPress事件中
  if(e.KeyChar == '+')  {    SendKeys.Send("A";    e.Handled = true;  } 

 16.怎样使Winform启动时直接最大化?  
this.WindowState = FormWindowState.Maximized;  

17.c#怎样获取当前日期及时间,在sql语句里又是什么?
  c#: DateTime.Now  sql server: GetDate() 

 18.怎样访问winform DataGrid的某一行某一列,或每一行每一列?  
dataGrid[row,col]  

19.怎样为DataTable进行汇总,比如DataTable的某列值‘延吉'的列为多少? 
 dt.Select("城市='延吉'".Length; 

 20.DataGrid数据导出到Excel后0212等会变成212。怎样使它导出后继续显示为0212? 
 range.NumberFormat = "0000"; 

 21.  
① 怎样把DataGrid的数据导出到Excel以供打印? 
② 之前已经为DataGrid设置了TableStyle,即自定义了列标题和要显示的列,如果想以自定义的视图导出数据该怎么办? 
③ 把数据导出到Excel后,怎样为它设置边框啊?  
④ 怎样使从DataGrid导出到Excel的某个列居中对齐? 
⑤ 数据从DataGrid导出到Excel后,怎样使标题行在打印时出现在每一页?  
⑥ DataGrid数据导出到Excel后打印时每一页显示’当前页/共几页’,怎样实现?  

答:
①  private void button1_Click(object sender, System.EventArgs e) 
 {    
int row_index, col_index;    
row_index = 1;    
col_index = 1;    
Excel.ApplicationClass excel = new Excel.ApplicationClass();    
excel.Workbooks.Add(true);                    
DataTable dt = ds.Tables["table"];                    
foreach(DataColumn dcHeader in dt.Columns)       
 excel.Cells[row_index, col_index++] = dcHeader.ColumnName;              
foreach(DataRow dr in dt.Rows)    
{
      col_index = 0;
          foreach(DataColumn dc in dt.Columns)          
{            excel.Cells[row_index+1, col_index+1] = dr[dc]; 
           col_index++;          
}      
row_index++;      }
      excel.Visible = true;      }  
private void Form1_Load(object sender, System.EventArgs e) 
 {  
    SqlConnection conn = new SqlConnection("server=tao;uid=sa;pwd=;database=pubs";  
    conn.Open();  
    SqlDataAdapter da = new SqlDataAdapter("select * from authors", conn);  
    ds = new DataSet();
    da.Fill(ds, "table"
    dataGrid1.DataSource = ds;  
    dataGrid1.DataMember = "table"; 
 } 

 ②dataGrid1.TableStyles[0].GridColumnStyles[index].HeaderText;//index可以从0~dataGrid1.TableStyles[0].GridColumnStyles.Count遍历。 

 ③ Excel.Range range;  
   range=worksheet.get_Range(worksheet.Cells[1,1],xSt.Cells[ds.Tables[0].Rows.Count+1,ds.Tables[0].Columns.Count]);  
   range.BorderAround(Excel.XlLineStyle.xlContinuous,Excel.XlBorderWeight.xlThin,Excel.XlColorIndex.xlColorIndexAutomatic,null);
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =Excel.XlLineStyle.xlContinuous;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight =Excel.XlBorderWeight.xlThin;
   range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex =Excel.XlColorIndex.xlColorIndexAutomatic;
  range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
  range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;

  ④ range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
  ⑤ worksheet.PageSetup.PrintTitleRows = "$1:$1";
  ⑥ worksheet.PageSetup.CenterFooter = "第&P页 / 共&N页";

  22.当把DataGrid的Cell内容赋值到Excel的过程中想在DataGrid的CaptionText上显示进度,但不显示。WHY?
  ...  dataGrid1.CaptionText = "正在导出:" + (row + 1) + "/" + row_cnt;
  System.Windows.Forms.Application.DoEvents();
  ...  处理当前在消息队列中的所有Windows消息。
  当运行Windows窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。如果在代码中调用DoEvents,则应用程序可以处理其他事件。
  如果从代码中移除DoEvents,那么在按钮的单机事件处理程序执行结束以前,窗体不会重新绘制。通常在循环中使用该方法来处理消息。

  23.怎样从Flash调用外部程序,如一个C#编译后生成的.exe?  fscommand("exec", "应用程序.exe";
  ① 必须把flash发布为.exe
  ② 必须在flash生成的.exe文件所在目录建一个名为fscommand的子目录,并把要调用的可执行程序拷贝到那里。

  24.有没有办法用代码控制DataGrid的上下、左右的滚动?
  dataGrid1.Select();
  SendKeys.Send("{PGUP}";
  SendKeys.Send("{PGDN}";
  SendKeys.Send("{^{LEFT}"; // Ctrl+左方向键
  SendKeys.Send("{^{RIGHT}"; // Ctrl+右方向键

  25.怎样使两个DataGrid绑定两个主从关系的表?
  DataGrid1.DataSource = ds;
  DataGrid1.DataMember = "母表";
  ...  
  DataGrid2.DataSouce = ds;
  DataGrid2.DataMember = "母表.关系名";

  26.assembly的版本号怎样才能自动生成?特别是在Console下没有通过VStudio环境编写程序时。
  关键是AssemblyInfo.cs里的[assembly: AssemblyVersion("1.0.*"],命令行编译时包含AssemblyInfo.cs 

 27.怎样建立一个Shared Assembly?
  用sn.exe生成一个Strong Name:keyfile.sn,放在源程序目录下
  在项目的AssemblyInfo.cs里[assembly: AssemblyKeyFile("..//..//keyfile.sn"]
  生成dll后,用gacutil /i myDll.dll放进Global Assembly Cach.

  28.在Oracle里如何取得某字段第一个字母为大写英文A~Z之间的记录?
  select * from table where ascii(substr(字段,1,1)) between ascii('A') and ascii('Z')  29.怎样取得当前Assembly的版本号?
  Process current = Process.GetCurrentProcess();
   FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(current.MainModule.FileName);
  Console.WriteLine(myFileVersionInfo.FileVersion);

  30.怎样制作一个简单的winform安装程序?
  ① 建一个WinForm应用程序,最最简单的那种。运行。
  ② 添加新项目->安装和部署项目,‘模板’选择‘安装向导’。
  ③ 连续二个‘下一步’,在‘选择包括的项目输出’步骤打勾‘主输出来自’,连续两个‘下一步’,‘完成’。
  ④ 生成。
  ⑤ 到项目目录下找到Setup.exe(还有一个.msi和.ini文件),执行。

  31.怎样通过winform安装程序在Sql Server数据库上建表?
  ① [项目]—[添加新项]  类别:代码;模板:安装程序类。
  名称:MyInstaller.cs
  ② 在SQL Server建立一个表,再[所有任务]—[生成SQL脚本]。
  生成类似如下脚本(注意:把所有GO语句去掉):
  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MyTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
  drop table [dbo].[MyTable]
  CREATE TABLE [dbo].[MyTable] (
      [ID] [int] NOT NULL ,
      [NAME] [nchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL
       ON [PRIMARY]  ALTER TABLE [dbo].[MyTable] WITH NOCHECK ADD
       CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
       (          [ID]       ON [PRIMARY]

   ③ [项目]—[添加现有项]。mytable.sql—[生成操作]-[嵌入的资源]。
  ④ 将MyInstaller.cs切换到代码视图,添加下列代码:
  先增加:  using System.Reflection;  using System.IO;
  然后:  private string GetSql(string Name)
   {
     try
     {
       Assembly Asm = Assembly.GetExecutingAssembly();
       Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);            StreamReader reader = new StreamReader(strm);
       return reader.ReadToEnd();
     }
     catch (Exception ex)
     {
       Console.Write("In GetSql:"+ex.Message);
       throw ex;
     }
   }

   private void ExecuteSql(string DataBaseName,string Sql)
   {
   System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
  sqlConn.ConnectionString = "server=myserver;uid=sa;password=;database=master";
  System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConn);
   Command.Connection.Open();
   Command.Connection.ChangeDatabase(DataBaseName); 
  try 
  {
   Command.ExecuteNonQuery();
   }
   finally
   {
   Command.Connection.Close();
   }
   }

  protected void AddDBTable(string strDBName)
   {
       try
       {
           ExecuteSql("master","create DATABASE "+ strDBName);
           ExecuteSql(strDBName,GetSql("mytable.sql");
       }
       catch(Exception ex)
       {
           Console.Write("In exception handler :"+ex.Message);
       }
   }

   public override void Install(System.Collections.IDictionary stateSaver)
   {
       base.Install(stateSaver);
       AddDBTable("MyDB"; //建一个名为MyDB的DataBase
  }

  ⑤ [添加新项目]—[项目类型:安装和部署项目]—[模板:安装项目]—[名称:MySetup]。
  ⑥ [应用程序文件夹]—[添加]—[项目输出]—[主输出]。
  ⑦ 解决方案资源管理器—右键—[安装项目(MySetup)]—[视图]—[自定义操作]。[安装]—[添加自定义操作]—[双击:应用程序文件夹]的[主输出来自***(活动)]。

  32.怎样用TreeView显示父子关系的数据库表(winform)?
  三个表a1,a2,a3, a1为a2看母表,a2为a3的母表。
  a1: id, name
  a2: id, parent_id, name
  a3: id, parent_id, name
  用三个DataAdapter把三个表各自Fill进DataSet的三个表。
  用DataRelation设置好三个表之间的关系。

  foreach(DataRow drA1 in ds.Tables["a1"].Rows)
  {
   tn1 = new TreeNode(drA1["name"].ToString());
   treeView1.Nodes.Add(tn1);
   foreach(DataRow drA2 in drA1.GetChildRows("a1a2")
   {
    tn2 = new TreeNode(drA2["name"].ToString());
    tn1.Nodes.Add(tn2);
    foreach(DataRow drA3 in drA2.GetChildRows("a2a3")
    {
     tn3 = new TreeNode(drA3["name"].ToString());
     tn2.Nodes.Add(tn3);
    }
   }
  }  

33.怎样从一个form传递数据到另一个form?  假设Form2的数据要传到Form1的TextBox。  
在Form2:  
// Define delegate  public delegate void SendData(object sender);  
// Create instance  public SendData sendData;  
在Form2的按钮单击事件或其它事件代码中:
  if(sendData != null) 
  {
   sendData(txtBoxAtForm2);
   }  
  this.Close(); //关闭Form2 

 在Form1的弹出Form2的代码中:
  Form2 form2 = new Form2();
  form2.sendData = new Form2.SendData(MyFunction);  
  form2.ShowDialog(); 
 ==================== 
 private void MyFunction(object sender) 
 {
    textBox1.Text = ((TextBox)sender).Text;
  }  

loading...

 

2006-5-11
企业财务电算化软件设计应注意的若干问题 [转]

 
 
现代电子技术在财经领域的应用――会计电算化,为会计管理开创了一个新时代,使现代财务管理搭上了“信息快车”,彻底摆脱了“会计室里的算盘、钞票、记账”等沉闷印象,财务管理进入了真正的“数字时代”,大大提高了管理水平和管理效率,产生了巨大的经济效益和社会效益。 
 
会计电算化是一项复杂的系统工程,技术性、创造性很强,与其他系统比较,有很大的特殊性,它处理的信息量大,数据要求准确可靠、保存期长,需要严格监控;同时,会计数据要求严格、保密性强,属企业敏感资料。因而,会计电算化对财务管理及其软件设计均有特别的要求:财务管理标准化、规范化;软件设计须具有安全可靠、功能多样性…… 
 
一、财务软件设计对会计工作的要求 
 
 1.增强法制观念,严格执行会计法 
 
会计法是我们开展企业会计工作的法律依据,执行会计法是国家对会计工作的基本要求,所以企业的财务工作必然遵守会计法,遵守国家有关信息安全的法规。只有依法办事,会计工作才受到法律保护,从而为会计电算化的实现提供稳定的法律环境。 
 
 2.会计科目代码化 
 
实行会计科目代码化的优点很多:(1)结构简单易记,便于会计人员使用;(2)便于电脑识别、分类、查验、调用和处理;(3)减少资料储存空间,减少电脑处理资料量,加快运行速度。企业会计科目代码必须采用会计制度规定的科目统一编码,例如现金101,银行存款102……这样既简单明了又便于计算机识别和处理,工作人员也乐于使用。如果缺少了这一重要环节,电脑系统就平添许多复杂内容,计算机不得不逐次识别处理每个会计科目,大大增加了程序设计的难度,而且多占了内存空间,减慢了计算机的运行速度,还会增加出错机会,不符合信息化环境的要求。因此,会计电算化首先要将会计科目代码代。 
 
 3.会计凭证标准化 
 
电算化环境下会计凭证的设计要求:(1)具有通用性――尽可能满足各职能部门对会计核算的要求,力求做到多功能、一单多用、各方共享,提高人机工作效率。以记账凭证设计为例。建议采用集现金收付、银行转账、往来于一身的复式记账凭证,其内容应包括:摘要、科目编码、会计科目、一二级明细目、外币种类、借贷方金额、备注等,这样既适合处理人民币业务,又能处理外币业务,基本满足了会计核算的多方面要求,而且考虑到了未来对外业务发展之需,符合通用、多功能的原则。(2)便于会计人员操作,易于计算机处理。凭证设计的另一个要求是尽可能减少工作人员的书写、输入量,减少人工处理业务方面的时间――在会计实务中,工作人员往往要花大部分时间填写凭证、处理会计资料,效率低、差错多,而电算化管理则要求最大限度地减少人为处理资料的时间,让计算机更多地代替人的劳动,以充分发挥电脑高速、高效的优势。 
 
同样道理,账簿设置、会计报表编制,也要符合标准化的要求,既要兼顾各方面需要,又要方便计算机处理。 
 
 4.会计处理方法制度化 
 
会计电算化系统繁复而涉及面广,不宜经常修改,这就要求会计核算的方法、程序实行制度化。例如,固定资产的折旧方法有平均年限法、工作量法、双倍余额递减法、年数总和法等几种,企业可按实际情况加以选择,但一经确定就不要随意更改,要形成制度化执行。如果会计处理方法更改频繁,一则不符合会计制度要求,二则影响电脑系统正常运作,容易发生差错。如果不慎修改出错,就会导致系统损坏,影响正常会计工作。几年前,英国某信用卡公司就因修改计算机程序出错,致使支付混乱。日常生活中,类似情况是屡有报道。因此,如无法规、制度的变更,一般不要随意更改会计核算方法,以保持会计业务环境相对稳定,保证电算化系统正常运作。 
 
 5.培养复合型人才,提高财务人员的整体素质 
 
综观目前的企业,既懂会计又懂计算机,并有一定英文英础的复合型人才实在太少,这是推行会计电算化的一大障碍。会计人员如果只懂会计,没有电脑知识,就不可能提出很好的会计管理构想去实现电子化;只有既熟悉会计,又具备一定电脑知识的会计专才,才能设计出优良的财务管理方案,让程序设计者去开发适用软件,使电算化发挥最大效能。再者,财务人员如具备一定电脑常识就能最大限度地避免操作错误,降低差错风险,从而保证会计数据安全。为此,企业要做好复合型人才的培训工作,让现职会计人员掌握电脑知识,为实现电算化提供重要条件。 
 
实践证明,企业要顺利实行电算化管理,必须切实做好以上各项基础工作,争取上级领导的大力支持,为落实基础工作提供保证。 
 
二、财务管理系统对软件设计的要求 
 
 1.高起点、高规格开发高质量的软件 
财务系统对企业很重要,准确程度要求高,不允许有半点差错,因而必须从高起点出发,聘请高水平、合资格、有财务软件开发经验的公司和工程人员负责开发,不能聘请不够资质、不合资格、无实践经验的人员开发。否则,会影响系统的质量、进度,甚至会半途而废。例如,广州某企业,因经费不足聘请了一家技术力量较弱的公司负责开发会计系统,由于设计人员水平较低,加之无实践经验、缺乏财务常识,开发出的系统漏洞百出,最终无法使用,给企业造成了损失;同时,严重影响了该单位的电子化进程。因此,财务系统开发,用户必须聘请技术力量雄厚、具备财务软件设计经验的单位和设计人员负责。 
 
 2.做好系统分析工作 
 
软件设计首先要从系统分析着手,目的在于了解财务工作流程,广泛收集必要数据,对相关的各种因素进行详细分析,这是软件设计的基础工作,很重要。对问题的分析是否深入细致、完整透彻,体现了设计人员对将要进行的工作的了解程度,也体现着基础工作准备是否充分,这关系到未来系统的成败,因而要充分重视系统分析工作。系统分析的具体步骤: 
 
 (1)成立专家小组,具体包括:委托方、软件设计人员、会计师、系统使用者、信息安全工程师等组成,为全面开展工作做好准备。 
 
 (2)落实任务,明确基本事项,确定具体要完成哪些工作。 
 
 (3)提出具体要求,包括:明确给出系统的规模;系统应能完成哪些工作;系统工作的步骤和方法:新系统应达到何种质量水平,以及具体的质量控制指标、计划进度等。 
 
 (4)收集、整理数据资料,包括:会计业务分工、业务量、业务处理方法、各类报表、输出结果的时间、数据储存要求等。 
 
 (5)认真编好会计业务流程图。会计业务流程图就是把会计业务的整个过程用图示和文字说明表述出来。这一过程很重要,是系统设计的基础、依据,财务系统就是根据会计业务流程图设计出来的,是会计业务流程的“数字化”。业务流程图质量的好坏直接决定着系统设计的成败。因此,必须认真踏实地做好业务 
流程图的编制工作。 
 
业务流程图须由专家小组编制,其间应重点发挥有实践经验的会计师、具体业务操作者的作用,重视一线员工的意见,尽最大可能满足第一线业务的需要。设计财务系统很重要的一条就是实用、方便操作,要考虑到一线业务的具体情况。只有理论和实践相结合,方便实务操作,财务系统才受使用者欢迎。 
 
业务流程图须同时采用文字说明、图形描述两种形式,以相互补充;有关说明、描述必须详细、周密、完善、步步到位,凡是业务触及到的细节均应详细说明、准确标出,为下一步程序设计工作提供充分依据。 
 
有的单位在开发财务软件系统时,只侧重程序设计环节,忽视业务流程图编制的重要性,结果到了程序设计阶段,不得不中断设计,回过头来抽出大量的人力、物力去临时补上有关业务流程细节,财务系统成了典型的“边设计边施工边补漏的‘三边’工程”。这样既容易出错又拖慢了工程进度,更谈不上周密完善,还会影响系统的设计质量,给企业造成损失。 
 
 (6)编制程序流程图。程序流程图是将系统设计的具体步骤,通过图示符号表示出来,它直观地反映了程序设计的构思过程,体现了整个程序运行的思路,是程序设计的关键一步,直接决定着程序设计质量的高低。同时,绘制好程序流程图非常有利于系统的整体控制。 
 
 (7)对前期基础准备工作进行严格审核。财务系统的设计是以各项优良的前期准备工作为前提的,基础工作显得尤为重要。顾此,在开展程序编写工作之前必须全面审查有关准备工作是否充分,发现问题及时解决;严禁边准备、边设计、边补漏。 
 
 3.程序设计阶段,采用模块化设计 
 
模块化就是把一个复杂的程序分成若干个功能不同的多个部分,各个子模块均有独立功能,可以单独运行;而把各个子模块组合在一起,又能方便地搭配成一个完整的系统。模块化设计是现代程序设计中一种很重要的技巧,有着众多优点: 
 
 (1)便于分工合作,提高效率,提高质量。系统设计时,可以把要做的工作分拆成多个部分,然后分配给不同的人,甚至不同的单位各自开发。这有利于提高效率,提高程序的设计质量。 
 
 (2)便于维护、维修,增强通用性、易读性。 
 
 (3)增强模块的独立性,降低相互之间的依赖程度。即使有某些部分故障,也不致影响系统的整体运行。 
 
 (4)能设计出可绕过障碍区运行的高质量软件――这是模块化设计的最大优点。由于模块之间相对独立,所以即使出现某些非关键性故障,系统依然能安全运行。这一点很重要,因为系统在使用中出现小故障是较常见的现象,如果财务系统具备了这种优点,就能做到不停机维修,不致影响日常业务,这对财务管理特别有意义。反过来,如果系统一有小毛病就会影响日常业务,甚至突然“死机”,就会严重打乱企业的管理秩序,还可能会造成数据丢失,给企业造成损失。所以,能做到小毛病不停机维修,大故障能尽快恢复是财务管理对其软件设计的特殊要求。  
 4.软件设计要有扩展性,以适应企业未来发展 
 
会计电脑系统设计要预计到企业各类业务的发展,要预留足够的扩展空间,以适应业务高层次、多元化发展。某些企业的电算化系统因没有扩展性,致使业务稍有变动,系统就无法适应,延误了日常工作。例如,一些企业的会计系统能处理人民币、港币、美元业务,但对日元、英镑、欧元或其他外币业务就难以适应。随着我国即将加入WTO,企业外币业务必然日益增多,缺乏扩展功能的会计系统将难于满足未来发展要求。因此,会计系统设计一定要有超前意识,要考虑到未来业务发展需要,设计有扩展性、多功能的软件。 
 
要考虑到某些特殊业务的需要。深圳市曾发生过这样一件事,一对从新疆调进该市的夫妇,在为小孩办理入户手续时,因公安局的户籍管理系统只能输入四个汉字以内的姓名,而该小孩是维吾尔族,名字由近十个汉字组成,超出了公安局电脑系统的设计要求,以至无法正常入户,引起了不必要的纠纷。以此为鉴,财务电脑系统应有处理特殊业务的设计,要考虑到特殊业务的需要。 
 
 5.强调面向用户 
 
财务系统的最终使用者是企业,是一线业务人员,所以要特别强调操作简单、方便用户,要设计良好的用户界面,具体操作应尽可能简单易学。在屏幕显示方式上,最好只显示与业务相关的资料,对可有可无的资料,如参考性、辅助性的资料则能省则省。切忌“和盘托出”――有用、暂不需用的资料均显示于屏幕,这样很容易造成操作错误,还会给人“眼花缭乱”的感觉。在目前企业计算机应用水平、管理水平不很高的情况下,“面向用户性”很值得广大设计人员的重视。 
 
 6.试运行 
 
系统完成开发后必须反复测试,证明达到设计要求,才能交付使用;不能边检测、边使用、边补救。 
 
 7.制定应急计划 
 
系统完成设计后,开发方应编制与系统相关的运行文件,并提出有关注意事项,以备在出现意外情况时,有条不紊地采取相应措施。使用单位也应制定自己的应急计划,以备急需。令人担忧的是,不少单位恰恰忽视了这一关键步骤,没有起码的应急计划,假如系统一旦出现故障,后果不堪设想,损失将是巨大的。 
 
 8.加强风险控制,保证信息安全 
 
实现会计电算化,必然解决信息安全问题。由于电子数据高度集中,高度依赖电脑,且受电脑病毒入侵、人为操作失误、机器故障、非法毁损等因素影响,数据很容易被破坏,因此,会计电算化必然加强信息安全管理,一方面制定各种严格的管理制度,加强风险控制,加强管理;另一方面加强对员工的信息安全教育,严禁未经受权人员上机操作;不能连接与业务无关的终端,禁止与互连网连接;采用先进的加密技术,安装“防火墙”,严防电脑病毒入侵,防止人为非法破坏数据。实践证明,严格、有效的管理制度是信息安全的最好保障。 
 
 9.加强对财务系统使用前的审计 
 
财务系统必须确保正确,才能投入使用,这是保证财务数据安全的关键。系统在投入使用前,应组织专家小组进行严格审计、从严检测,并实地模拟运行。只有证明正确无误的系统方可正式投入使用,只有经过“实战”检验的系统才具有可靠性。必须指出的是,财务系统不能边使用、边检测、边维修,这样风险很大,难于保证数据安全。 
 
 ]实行会计电算化,要求财务管理标准化、规范化,而财务软件设计则要符合财务管理的特殊要求。只有相互适应、互相配合,才能设计出安全可靠、多功能、高质量的优秀软件,更好地推进会计电子化工作。财务电算化是大势所趋,是提高企业科学管理水平、增强竞争力的迫切要求――会计师、程序设计人员在这方面有着异常重要的作用,应充分调动他们的积极性、创造性。
loading...

 

2006-4-17
把DataGrid导出到Excel [转]

youedatagrid.datasource=yourgetdatasourcemethord() 

youedatagrid.databind();


Response.Clear();
Response.Buffer=true;
Response.ContentType="application/vnd.ms-excel";
Response.Charset="";
this.EnableViewState=false; 


stringwriter  sw=new  stringwriter();
HtmlTextWriter  htw=new  HtmlTextWriter(sw);
YoueDataGrid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

DataGrid导出到Excel的时候,某些数字内容显示不正确,"3.62201E+14"的格式

webform中,在datagrid的itemdatabound事件内

if(e.item.itemtype  ==  ListItemType.Item  ||  e.Item.ItemType  ==  ListItemType.AlternatingItem)
{
e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@";

这样导出就没有问题了


在WinForm内Excel.Range  range  =  (Excel.Range)worksheet.Cells[1,1];
//设置单元格数字内容显示格式
range.NumberFormat  =  Excel.XlParameterDataType.xlParamTypeUnknown;
这样导出就没有问题了。

DataGrid输出到Excel并进行格式化处理

在我们把datagrid上的数据导入到excel的时候,如果遇到比较长的数字字符串,比如身份证号码,就会在excel里当成数字看待,并转换成科学计数法的格式,造成数据的丢失,下面这个方法就解决了这个问题,并示例如何进行其它的格式化。

查看例子

OutPutExcel.aspx

<%@ Page language="c#" Codebehind="OutPutExcel.aspx.cs"
 AutoEventWireup="false" Inherits="eMeng.Exam.OutPutExcel" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>OutPutExcel</title>
</HEAD>

<form id="Form1" method="post" runat="server">
<aspataGrid id="DataGrid1" runat="server"></aspataGrid>
<asp:Button id="Button1" runat="server" Text="输出到Excel"></asp:Button>
</form>

</HTML>


OutPutExcel.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace eMeng.Exam
{
/// <summary>
/// OutPutExcel 的摘要说明。
/// </summary>
public class OutPutExcel : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
DataGrid1.DataSource=CreateDataSource();
DataGrid1.DataBind();
}
/// <summary>
/// 创建数据源
/// </summary>
/// <returns>DataView</returns>
ICollection CreateDataSource() 
{

DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("身份证号码", typeof(string)));
dt.Columns.Add(new DataColumn("图书单价",typeof(decimal)));
dt.Columns.Add(new DataColumn("购买数量",typeof(Int32)));
dt.Columns.Add(new DataColumn("总价格",typeof(decimal)));


for (int i = 0; i < 30; i++) 
{
dr = dt.NewRow();

dr[0] = "123456789123456789";
dr[1] = 100 * i /3.0;
dr[2] = i + 5;
dr[3] = (decimal)dr[1] * (Int32)dr[2];
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
/// <summary>
/// 输出到Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button1_Click(object sender, System.EventArgs e)
{
Response.Clear(); 
Response.Buffer= true; 
Response.Charset="GB2312";    
Response.AppendHeader("Content-Disposition","attachment;filename=FileName.xls"
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312";//设置输出流为简体中文
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
this.EnableViewState = false;    
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad); 
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.DataGrid1.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString());
Response.End();
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@";
e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00";
}
}
}
}

loading...

 

2006-4-17
javascript配合DataGrid操作常用函数

javascript实现datagrid客户端checkbox列的全选,反选 

/**//* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.Header)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkAll").Attributes.Add("onclick","CheckAll('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
    }
*/
function CheckAll(prefix,chkAll,chkSingle)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            tempObj.checked = objChkAll.checked;
        }
    }
}
/**//* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkSingle").Attributes.Add("onclick","CheckSingle('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
    }
*/
function CheckSingle(prefix,chkAll,chkSingle)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            if(tempObj.checked)
            {
                checkCount++;
            }
            else
            {
                objChkAll.checked = false;
                //break;
            }
            allCount++;
        }
    }
    if(checkCount != allCount)
    {
        objChkAll.checked = false;
    }
    else
    {
        if(allCount != 0)
        {
            objChkAll.checked = true;
        }
    }
}
/**//*
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    type:1【全选】,2【反选】,3【取消】
    
    使用方法:
    this.btnSelectAll.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',1);";
    this.btnUnSelectAll.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',2);";
    this.btnCancelSelect.Attributes.Add("onClick","CheckType('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle',3);";
*/
function CheckType(prefix,chkAll,chkSingle,type)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            switch(type)
            {
                case 1:
                    tempObj.checked = true;
                    break;
                case 2:
                    tempObj.checked = !tempObj.checked;
                    break;
                case 3:
                    tempObj.checked = false;
                    break;
            }
            if(tempObj.checked)
            {
                checkCount++;
            }
            allCount++;
        }
    }
    if(checkCount != allCount)
    {
        objChkAll.checked = false;
    }
    else
    {
        if(allCount != 0)
        {
            objChkAll.checked = true;
        }
    }
    window.event.returnValue = false;
    return false;
}

/**//*
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID

    使用方法:
    this.btnDelete.Attributes.Add("onClick","SubmitCheckBox('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');";
*/
function SubmitCheckBox(prefix,chkAll,chkSingle,msg)
{
    var indexChkAll;
    if(prefix.length != 0)
    {
        indexChkAll        = prefix + "__ctl2_" + chkAll;
    }
    else
    {
        indexChkAll        = chkAll;
    }
    var objChkAll = document.getElementById(indexChkAll);
    
    var tempObj;
    var allCount    = 0;
    var checkCount    = 0;
    for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj = document.forms[0].elements[i];
        if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            if(tempObj.checked)
            {
                checkCount++;
            }
            allCount++;
        }
    }
    if(allCount == 0) //没有数据
    {
        window.alert("当前没有" + msg + "可供删除";
        window.event.returnValue = false;
        return false;
    }
    else
    {
        if(checkCount == 0)
        {
            window.alert("没有选中要删除的" + msg + "";
            window.event.returnValue = false;
            return false;
        }
        else
        {
            //if(window.confirm("确定要删除当前选中的【" + checkCount.toString() + "】项吗?" == false)
            if(window.confirm("确定要删除当前选中的" + msg + "吗?" == false)
            {
                window.event.returnValue = false;
                return false;
            }
        }
    }


loading...

 

2006-3-22
ADO.NET学习笔记 [转]

操纵dataset
在DataSet中DataRow是其所有数据的基本存放位置,它主要是由一个值数组组成,代表DataTable单独一行。
DataRow中主要包括一下几种信息:1、行中每一列的当前值,2、行中每一列的原始值,3、行状态,4、父行与子行间的链接

初始化一个DataRow:
DataTable dataTable=dataSet.Tables[0];
DataRow newRow=dataTable.NewRow(); //用dataTable生成DataRow可以利用dataTable里面的模式
dataTable.Rows.Add(newRow);

删除行:
DataTable.Rows.Remove(行实例);
DataTable.Rows.RemoveAt(行号);
DataRow.Delete(); //行自身移除

读写DataRow的值:
row["列名"],row[列号]均可引用其中的一个属性
DataColumn a=dataTable.Columns("列名"; //可以获得一个列

对行进行批处理更改:
BeginEdit()开始更改,EndEdit()结束更改,同时将更改结果写入DataSet,CancelEdit(),取消更改
例如:
row.BeginEdit();
对row进行更改
row.EndEdit();

将数据批量加载到DataTable
dataTable.BeginLoadData();
dataTable.LoadDataRow(row1,false); //第二个参数为true时,调用dataTable.AcceptChanges()时接受更改,为false直接添加
……
dataTable.EndLoadData();
使用这种数据加载方式可以在数据加载期间屏蔽所有的数据约束,索引也不会予以维护,极大的加快了数据加载速度

行的版本:
current:当前值
default:根据操作的不同决定行的default值
original:最后一次调用AcceptChanges()之后的值
proposed:调用AcceptChanges()之前被更改的值
例如要获得行的original值:
String oldString=row("FirstName",DataRowVersion.original);

行的状态:
row.RowState获得行的状态,例如删除后变成Deleted,数据存储更新后变为unchanged

六、DataSet导航
在ADO.NET中每个表都保持其相对独立性,允许在行级上导航不同表之间的相关行(向下导航到子行,向上导航的父行)
如DataRow[] invoiceRows=custRow.GetChildRows("Customer_invoice";    //通过关系导航到子行

七、DataView
DataView就时数据视图,为数据库结构提供了外模式的实现。
同时DataView也可以为窗体控件和Web控件提供数据绑定功能,在每一个DataTable中内建了一个DataView为:DataTable.DefaultView();

创建DataView
DataView sortedView=new DataView(dataTable);

对DataView进行排序
dataTable.DefaultView.sort="lastName";
dataTable.DefaultView.sort="lastName,FirstName DESC";

对DataView进行筛选:
1、通过对其中的RowFilter属性设置可以实现筛选
dataTable.DefaultView.RowFilter="Vendor='Rawlings'";
不过筛选表达式只能设置成比较简单的表达式,功能有限,不过可以满足基本的要求。
同样在DataTable里面也可以进行简单的搜索,返回一个DataRow数组,例:
DataRow[] compoundRows=dataTable.select("Vendor='wilson' AND price>20.00)
2、通过RowState来筛选
dataTable.DefaultView.RowStateFilter="DataViewRowState.originalRows"可以筛选出符合要求状态的row

对DataView进行搜索:
相对于DataView使用RowFilter进行筛选得到一个矩形数据集,使用Find、FindRows可以更准确的查找到与特定键相匹配的行
搜索的时候必须首先设置DataView的sort属性:
int found=dataTable.DefaultView.Find("wilson"; //获得行的位置
DataRowView[] rows=dataTable.DefaultView.FindRows("Rawlings" //过得一个row数组

八、更新DB
在DataSet中,每一个DataTable对应着一个DataAdapter,DataAdapter.Update()时,DataTable自动更新。
更新的时候可以使用CommandBuilder自动根据DataSet的变化生成更新的SQL命令
SqlCommandBuilder bldr=new SqlCommandBuilder(dataAdapter);
dataAdapter.Update(custTable);
不过Update接受DataSet参数并不更新DataSet而是更新DataSet中的一个叫"Table"的表
使用CommandBuilder进行更新的时候要注意一下几点:
1、SelectCommand必须有效
2、必须有主码
3、若SelectCommand填充DataTable后架构发生改变,应该在Update()之前调用CommandBuilder.RefreshSchema();
4、更新DB时不受关系、约束或者DataSet中其他表的影响
虽然使用CommandBuilder比较方便,不用自己写更新命令,但自动生成的命令性能不高,这时可以考虑自己编写存储过程或直接使用带参数的sql语句,例如:
String insQry="Insert into Customer(CustomerID) Values (@Customer)";
SqlCommand insCmd=conn.CreateCommand();
insCmd.CommandText=insQry;
SqlParameterCollection insParams=insCmd.Parameters;
insParams.Add("@CustomerID",SqlDbType.UniqueIdentifier,0,"CustomerID";
dataAdapter.InsertCommand=insCmd;
dataAdapter.Update();
在dataAdapter.Update()更新时还可以控制更新的范围:
dataAdapter.Update(invTable.GetChanges(DataRowState.Deleted); //只更新被删除的部分

九、事务
tx=conn.BeginTransaction(IsolationLevel.Serializable);
invDA.SelectCommand.Transaction=tx;
事务操作
tx.Commit();提交 //tx.Rollback();事务回滚

十、数据绑定
简单版本:(对文本框、标签等)
{Controls}.DataBindings.Add("{Property}",{dataSource},"{dataMember}";
其中Property为待绑定的属性,dataSource为DataView或DataTable,dataMember为dataSource其中的某个属性

复杂版本:(对ListBox、ComboBox等)
要分别设置各个属性实现绑定:
DataSource=支持IList的一个对象(DataTable或DataView)
DisplayMember:待显示的DataSource中的一个属性
ValueMember:确定在DataSource中引用哪一个数据行,即实现与DisplayMember的名值对应

DataGrid绑定:
1、可以设置DataSource属性实现静态绑定
2、可以使用SetDataBinding函数实现动态绑定

同时DataGrid支持主控/详细表显示
masterGrid.setDataBinding(customerTable,"";
detailGrid.setDataBinding(customerTable,"Customer_Invoices" //第二个属性要设置成关系约束
这样在主表中选择一行,在子表中就根据主表行中外码在子表中找到相应行

绑定之后,绑定项中就有一个CurrencyManager属性实现游标功能
BindingContext[CustomerTable]返回一个CurrencyManager对象,其中的Position属性可以更改,实现游标的移动。

loading...

 

2006-3-22
SQL 和C#里面出现奇怪的错误处理 [原]

今天编程 的时候出现了如下的错误:

在此上下文中不允许使用 此处只允许使用常量、表达式或变量。不允许使用列名。

查找发现,连接数据库的类,里面没有任何的错误,我把异常处理关闭掉,也发现无法显示我需要的信息,知道后来调试该存储过程的时候,把sql语句print出来,发现是没有使用“”所至!!!!!!


loading...

 

2006-3-20
ASP.NET将EXCEL导入SQL SERVER数据库的代码 [原]

前言:cmd.CommandText="Proc_Address";这句话是调用存储过程"Proc_Address"
该存储过程代码为:
CREATE Proc Proc_Address @CardNo char(20),@ToAddress char(50),@CCAddress char(50) ,@YYYYMM char(12)
 as 
declare @strSql  char (400)

set @strSql = 'Insert into EmailAddress' + @YYYYMM + ' values(''+@CardNo+'',''+@ToAddress+'',''+@CCAddress+'',''+'1')'  --插入一条记录
exec (@strSql)
GO



private void Button1_Click(object sender, System.EventArgs e)
{
CreateTable();

//先将EXCEL导入到数据库,一:先把EXCEL导入dateView,二:然后将dateView里的数据导入到数据库里面

//EXCEL 的连接串
string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + File1.PostedFile.FileName.ToString() + ";" +
"Extended Properties=Excel 8.0;";

//建立EXCEL的连接
OleDbConnection objConn = new OleDbConnection(sConnectionString);

objConn.Open();

OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [Sheet1$]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;

DataSet objDataset1 = new DataSet();

objAdapter1.Fill(objDataset1, "XLData";

// DataGrid1.DataSource = objDataset1.Tables[0].DefaultView; //测试代码,用来测试是否能读出EXCEL上面的数据
// DataGrid1.DataBind();

DataTable dt = objDataset1.Tables[0];
DataView myView = new DataView(dt);

//SQL SERVER的数据库连接
SqlConnection conn;
string dns =System.Configuration.ConfigurationSettings.AppSettings["ConStr"];//连接串
conn=new SqlConnection(dns);

SqlCommand cmd =conn.CreateCommand();
cmd.CommandType =CommandType.StoredProcedure;
cmd.CommandText="Proc_Address";

int count=0;//用来记录出错的条数

try
{
foreach (DataRowView myDrv in myView)
{
count++;
//要关闭上一次的SQL Server的连接
if (conn.State.ToString()!="Closed"
conn.Close();

//每一次都要清空所有的CMD的参数
cmd.Parameters.Clear();

//执行存储过程
//首先获得参数 共 3个
//@CardNo,@ToAddress,@CCAddress
SqlParameter paraCardNo =cmd.Parameters.Add("@CardNo",SqlDbType.Char);
SqlParameter paraToAddress =cmd.Parameters.Add("@ToAddress",SqlDbType.Char);
SqlParameter paraCCAddress =cmd.Parameters.Add("@CCAddress",SqlDbType.Char);
SqlParameter paraYYYYMM =cmd.Parameters.Add("@YYYYMM",SqlDbType.Char);

//表示是输出参数
paraCardNo.Direction = ParameterDirection.Input;
paraToAddress.Direction = ParameterDirection.Input; 
paraCCAddress.Direction = ParameterDirection.Input;
paraYYYYMM.Direction = ParameterDirection.Input;

//参数赋值
paraCardNo.Value = myDrv[0].ToString().Trim();
paraToAddress.Value = myDrv[1].ToString().Trim();
paraCCAddress.Value = myDrv[2].ToString().Trim();
paraYYYYMM.Value = ddlYear.Items[ddlYear.SelectedIndex].Value + ddlMonth.Items[ddlMonth.SelectedIndex].Value;

conn.Open();
cmd.ExecuteNonQuery();//写入SQL数据库
}
}
catch
{
Page.Response.Write("alert('第"+count.ToString()+"条数据出错!');";
objConn.Close();//关闭EXCEL的连接
}

objConn.Close();//关闭EXCEL的连接
loading...

 

2006-2-20
在Web上使用信使服务 [转]

前段时间开发一个Web项目,客户要求有即时消息提示功能:
1. 客户端不能安装软件;
2. 客户端不需要打开网页就可以收到即时消息
3. 无论客户端在使用任何软件的时候即时消息都要能被客户马上看到
考虑到客户的网络环境是简单的对等网,通过工作组来分配单位的各个部门,因此采用即时消息服务来解决。
以下是代码,望大家提供意见和建议

using System;
using System.Runtime.InteropServices;

namespace test
{
 /// <summary>
 /// NetSend 的摘要说明。
 /// </summary>
 public class NetSend
 {
  public NetSend()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public int SendMessage(string sFrom,string sTo,string sMessage)
  {
   byte[] bBuffer = System.Text.Encoding.Unicode.GetBytes(sMessage);
   int nRet = NetMessageBufferSend(null,sTo,null,sMessage,sMessage.Length*2+2);
   return nRet;
  }

  [DllImport ("Netapi32", CharSet=CharSet.Unicode)] 
  public static extern int NetMessageBufferSend( string servername, string msgname, string fromname, string buf, int buflen);
 }
}

补充NET SEND的语法:
NET SEND {name | * | /DOMAIN[:name] | /USERS} message

loading...

 

2006-2-7
自动更新的原理


    需要自动更新的时候,客户端软件提交更新请求给固定的网址,然后网址返回最新版本的版本号。客户端软件和自己的版本号对比,如果发现服务器的版本和自己的版本不一样,那么就请求下载升级补丁。服务器响应请求,提供补丁下载;下载成功后,手动或自动安装一下就可以了。

    安装补丁的时候,客户端的主程序一般是要关闭的,除非采用动态卸载、调入组件的技术,比如网络游戏,就是尽量让玩家边玩游戏边更新。

    如果更新的是主程序,那么就必须关闭主程序了。可是主程序关闭了之后,谁来调用安装补丁呢?为了解决这个问题,人们把主程序和自动更新程序分开来做。当需要校验版本的时候,主程序调用自动更新程序。自动更新程序如果发现主程序需要更新,在下载了升级补丁之后,就会要求关闭主程序。主程序关闭之后,自动更新程序调用升级补丁进行安装,安装完成后再重新启动主程序。自动更新程序自动退出,完成更新任务。这和你刚才关闭电脑后再插网卡的原理是一模一样的。其实生活中有很多现象可以借鉴到软件设计中。

   人们嫌这样的升级仍然太麻烦,后来出现了B/S结构,大家像抓住了救命稻草一样的追捧至今,希望能从这些劳动中解脱出来。B/S结构就是浏览器/服务器结构,它所有的功能,都是在浏览器里完成。程序升级的时候,只需要在服务端升级一下就可以了,浏览器再次访问服务器的时候,得到的就是新版本。你可以把它理解成一个纯粹的网站。是不是站长更新的时候,你打开网站就看到最新的页面?

   但是B/S结构有天生的弱点,因为它是基于网页浏览的,所以安全性是首要的难题,你能浏览的东西,原则上别人也能浏览。而且出于安全考虑,B/S访问本地资源,比如串口,必须借助于其他技术实现。B/S也不是万能的,必须考虑实际应用。

附录:Winform的自动更新

winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了这一缺陷,有较好的参考价值。 

一、升级的好处。 
长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序的可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素,也是那些B/S的支持者们将Client/Server结构打入地狱的一个重要原因。 

现在好了,我们就在最新的基于Microsoft 的 WinForm上用WebServices来实现软件的自动升级功能。 

二、升级的技术原理。 
升级的原理有好几个,首先无非是将现有版本与最新版本作比较,发现最新的则提示用户是否升级。当然也有人用其它属性比较的,例如:文件大小。 或者更新日期。 
而实现的方法呢?在VB时代,我使用的是XmlHTTP+INet控件。用XmlHTTP获取信息,用INET传输升级文件,而用一个简单的BAT文件来实现升级。 

Public Sub CheckUpdate() 
On Error Resume Next 
Dim b As Boolean 
Dim XmlHttp As Object 
Set XmlHttp = CreateObject("Microsoft.XMLHttp" 
XmlHttp.Open "GET", "Http://mu.5inet.net/MuAdmin/update.xml", False 
XmlHttp.Send 

Dim vs As String 
vs = XmlHttp.responseText 
If Err.Number > 0 Then 
Exit Sub 
End If 

Dim Xml As Object 
Set Xml = CreateObject("Microsoft.XmlDom" 
Xml.LoadXml vs 
Dim Version As String 
Dim downAddr As String 
Dim FSize As Long 
Dim fInfo As String 
Version = Xml.DocumentElement.ChildNodes(0).Text 
downAddr = Xml.DocumentElement.ChildNodes(1).Text 
FSize = CLng(Xml.DocumentElement.ChildNodes(2).Text) 
fInfo = Xml.DocumentElement.ChildNodes(3).Text 
Set Xml = Nothing 
Set XmlHttp = Nothing 

Dim Major As Long 
Dim Minor As Long 
Dim Revision As Long 
Dim C() As String 
C = Split(Version, "." 
Major = CLng(C(0)) 
Minor = CLng(C(1)) 
Revision = CLng(C(2)) 

If Major > App.Major Then 
b = True 
ElseIf Minor > App.Minor Then 
b = True 
ElseIf Revision > App.Revision Then 
b = True 
Else 
b = False 
End If 
If (b) Then 
Dim result As VbMsgBoxResult 
result = MsgBox("发现程序新版本。当前版本为:" & App.Major & "." & App.Minor & "." & App.Revision & ",目前最新版本为:" & Version & ",是否进行更新?", vbQuestion Or vbYesNo, "自动更新" 
If result = vbYes Then 
Dim frm As New Update 
frm.DownloadAddress = downAddr 
frm.size = FSize 
frm.InfoPage = fInfo 
frm.Version = Version 
frm.Show vbModal 
End If 
End If 
End Sub 


而BAT文件有个特性,是可以删除自己本身。下面是BAT文件的内容. 
@echo off 
echo 
echo echo 欢迎使用无垠奇迹管理器升级向导。 
echo 本次升级版本为:1.1.0。 
echo 请按任意键开始升级无垠奇迹管理器... echo 
echo 
pause 
del SQLSrvBrowser.Exe 
ren ~update.tmp SQLSrvBrowser.Exe 
echo 升级成功,按任意键重新启动应用程序。 
pause 
start ::URL::http://mu.5inet.net/  
start SQLSrvBrowser.Exe 
del update.bat 


三、在.Net时代的实现。 
在.Net时代,我们就有了更多的选择,可以使用WebRequest,也可以使用WebServices。在这里我们将用WebServices来实现软件的自动升级。 

实现原理:在WebServices中实现一个GetVer的WebMethod方法,其作用是获取当前的最新版本。 
  然后将现在版本与最新版本比较,如果有新版本,则进行升级。 

  步骤: 
    1、准备一个XML文件 (Update.xml)。 
<?xml version="1.0" encoding="utf-8" ?> 
<product> 
<version>1.0.1818.42821</version> 
<description>修正一些Bug</description> 
<filelist count="4" sourcepath="./update/"> 
<item name="City.xml" size=""> 
<value /> 
</item> 
<item name="CustomerApplication.exe" size=""> 
<value /> 
</item> 
<item name="Interop.SHDocVw.dll" size=""> 
<value /> 
</item> 
<item name="Citys.xml" size=""> 
<value /> 
</item> 
</filelist> 
</product> 
作用是作为一个升级用的模板。 
    2、WebServices的GetVer方法。 


[WebMethod(Description="取得更新版本"
public string GetVer() 

XmlDocument doc = new XmlDocument(); 
doc.Load(Server.MapPath("update.xml"); 
XmlElement root = doc.DocumentElement; 
return root.SelectSingleNode("version".InnerText; 

     3、WebServices的GetUpdateData方法。 
[WebMethod(Description="在线更新软件"
[SoapHeader("sHeader"
public System.Xml.XmlDocument GetUpdateData() 

//验证用户是否登陆 
if(sHeader==null) 
return null; 
if(!DataProvider.GetInstance.CheckLogin(sHeader.Username,sHeader.Password)) 
return null; 
//取得更新的xml模板内容 
XmlDocument doc = new XmlDocument(); 
doc.Load(Server.MapPath("update.xml"); 
XmlElement root = doc.DocumentElement; 
//看看有几个文件需要更新 
XmlNode updateNode = root.SelectSingleNode("filelist"
string path = updateNode.Attributes["sourcepath"].Value; 
int count = int.Parse(updateNode.Attributes["count"].Value); 
//将xml中的value用实际内容替换 
for(int i=0;i<count;i++) 

XmlNode itemNode = updateNode.ChildNodes[i]; 
string fileName = path + itemNode.Attributes["name"].Value; 
FileStream fs = File.OpenRead(Server.MapPath(fileName)); 
itemNode.Attributes["size"].Value = fs.Length.ToString(); 
BinaryReader br = new BinaryReader(fs); 
//这里是文件的实际内容,使用了Base64String编码 
itemNode.SelectSingleNode("value".InnerText = Convert.ToBase64String(br.ReadBytes((int)fs.Length),0,(int)fs.Length); 
br.Close(); 
fs.Close(); 

return doc; 

    4、在客户端进行的工作。 
      首先引用此WebServices,例如命名为:WebSvs, 
string nVer = Start.GetService.GetVer();  
if(Application.ProductVersion.CompareTo(nVer)<=0) 
update(); 

在本代码中 Start.GetService是WebSvs的一个Static 实例。首先检查版本,将结果与当前版本进行比较,如果为新版本则执行UpDate方法。 void update() 

this.statusBarPanel1.Text = "正在下载..."; 
System.Xml.XmlDocument doc = ((System.Xml.XmlDocument)Start.GetService.GetUpdateData()); 
doc.Save(Application.StartupPath + @"/update.xml"
System.Diagnostics.Process.Start(Application.StartupPath + @"/update.exe"
Close(); 
Application.Exit(); 
}这里为了简单起见,没有使用异步方法,当然使用异步方法能更好的提高客户体验,这个需要读者们自己去添加。:) update的作用是将升级的XML文件下载下来,保存为执行文件目录下的一个Update.xml文件。任务完成,退出程序,等待Update.Exe 来进行升级。     5、Update.Exe 的内容。 private void Form1_Load(object sender, System.EventArgs e) 

System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses(); 
foreach(System.Diagnostics.Process p in ps) 

//MessageBox.Show(p.ProcessName); 
if(p.ProcessName.ToLower()=="customerapplication" 

p.Kill(); 
break; 


XmlDocument doc = new XmlDocument(); 
doc.Load(Application.StartupPath + @"/update.xml"
XmlElement root = doc.DocumentElement; 
XmlNode updateNode = root.SelectSingleNode("filelist"
string path = updateNode.Attributes["sourcepath"].Value; 
int count = int.Parse(updateNode.Attributes["count"].Value); 
for(int i=0;i<count;i++) 

XmlNode itemNode = updateNode.ChildNodes[i]; 
string fileName = itemNode.Attributes["name"].Value; 
FileInfo fi = new FileInfo(fileName); 
fi.Delete(); 
//File.Delete(Application.StartupPath + @"/" + fileName); 
this.label1.Text = "正在更新: " + fileName + " (" + itemNode.Attributes["size"].Value + " ..."; 
FileStream fs = File.Open(fileName,FileMode.Create,FileAccess.Write); 
fs.Write(System.Convert.FromBase64String(itemNode.SelectSingleNode("value".InnerText),0,int.Parse(itemNode.Attributes["size"].Value)); 
fs.Close(); 

label1.Text = "更新完成"; 
File.Delete(Application.StartupPath + @"/update.xml"
label1.Text = "正在重新启动应用程序..."; 
System.Diagnostics.Process.Start("CustomerApplication.exe"
Close(); 
Application.Exit(); 
} 这个代码也很容易懂,首先就是找到主进程,如果没有关闭,则用Process.Kill()来关闭主程序。然后则用一个XmlDocument来Load程序生成的update.xml文件。用xml文件里指定的路径和文件名来生成指定的文件,在这之前先前已经存在的文件删除。更新完毕后,则重新启动主应用程序。这样更新就完成了。 


loading...

 

2006-2-6
摘要:c#.net常用函数列表

1、DateTime 数字型 
System.DateTime currentTime=new System.DateTime(); 
1.1 取当前年月日时分秒 
currentTime=System.DateTime.Now; 
1.2 取当前年 
int 年=currentTime.Year; 
1.3 取当前月 
int 月=currentTime.Month; 
1.4 取当前日 
int 日=currentTime.Day; 
1.5 取当前时 
int 时=currentTime.Hour; 
1.6 取当前分 
int 分=currentTime.Minute; 
1.7 取当前秒 
int 秒=currentTime.Second; 
1.8 取当前毫秒 
int 毫秒=currentTime.Millisecond; 
(变量可用中文) 

1.9 取中文日期显示——年月日时分 
string strY=currentTime.ToString("f"; //不显示秒 

1.10 取中文日期显示_年月 
string strYM=currentTime.ToString("y"

1.11 取中文日期显示_月日 
string strMD=currentTime.ToString("m"

1.12 取当前年月日,格式为:2003-9-23 
string strYMD=currentTime.ToString("d"

1.13 取当前时分,格式为:14:24 
string strT=currentTime.ToString("t"

2、Int32.Parse(变量) Int32.Parse("常量" 
字符型转换 转为32位数字型 

3、 变量.ToString() 
字符型转换 转为字符串 
12345.ToString("n"; //生成 12,345.00 
12345.ToString("C"; //生成 ¥12,345.00 
12345.ToString("e"; //生成 1.234500e+004 
12345.ToString("f4"; //生成 12345.0000 
12345.ToString("x"; //生成 3039 (16进制) 
12345.ToString("p"; //生成 1,234,500.00% 


4、变量.Length 数字型 
取字串长度: 
如: string str="中国"; 
int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名 

5、System.Text.Encoding.Default.GetBytes(变量) 
字码转换 转为比特码 
如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); 
然后可得到比特长度: 
len = bytStr.Length; 

6、System.Text.StringBuilder("" 
字符串相加,(+号是不是也一样?) 
如:System.Text.StringBuilder sb = new System.Text.StringBuilder(""
sb.Append("中华"
sb.Append("人民"
sb.Append("共和国"

7、变量.Substring(参数1,参数2); 
截取字串的一部分,参数1为左起始位数,参数2为截取几位。 
如:string s1 = str.Substring(0,2); 

8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 
取远程用户IP地址 

9、穿过代理服务器取远程用户真实IP地址: 
if(Request.ServerVariables["HTTP_VIA"]!=null){ 
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); 
}else{ 
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 


10、 Session["变量"]; 
存取Session值; 
如,赋值: Session["username"]="小布什"; 

取值: Object objName=Session["username"]; 
String strName=objName.ToString(); 
清空: Session.RemoveAll(); 

11、String str=Request.QueryString["变量"]; 
用超链接传送变量。 
如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a> 
在Edit.aspx页中取值:String str=Request.QueryString["fdid"]; 

12、DOC对象.CreateElement("新建节点名"
创建XML文档新节点 

13、父节点.AppendChild(子节点); 
将新建的子节点加到XML文档父节点下 

14、 父节点.RemoveChild(节点); 
删除节点 

15、Response 
Response.Write("字串"; 
Response.Write(变量); 
向页面输出。 

Response.Redirect("URL地址"); 
跳转到URL指定的页面 

16、char.IsWhiteSpce(字串变量,位数)——逻辑型 
查指定位置是否空字符; 
如: 
string str="中国 人民"; 
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。 

17、char.IsPunctuation(''字符'') --逻辑型 
查字符是否是标点符号 
如:Response.Write(char.IsPunctuation(''A'')); //返回:False 

18、(int)''字符'' 
把字符转为数字,查代码点,注意是单引号。 
如: 
Response.Write((int)''中''); //结果为中字的代码:20013 

19、(char)代码 
把数字转为字符,查代码代表的字符。 
如: 
Response.Write((char)22269); //返回“国”字。 

20、 Trim() 
清除字串前后空格 

21 、字串变量.Replace("子字串","替换为" 
字串替换 
如: 
string str="中国"; 
str=str.Replace("国","央"; //将国字换为央字 
Response.Write(str); //输出结果为“中央” 

再如:(这个非常实用) 

string str="这是脚本"; 
str=str.Replace("<","<font><</font>"; //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原) 
Response.Write(str); //显示为:“这是脚本” 

如果不替换,将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。 
这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。 
具体实现:将你的表单提交按钮脚本加上下面代码: 
string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 
strSubmit=strSubmit.Replace("<","<font><</font>"
然后保存或输出strSubmit。 
用此方法还可以简单实现UBB代码。 

22、Math.Max(i,j) 
取i与j中的最大值 
如 int x=Math.Max(5,10); // x将取值 10 

23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: 

(1)、 
string str1; str2 
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: 
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"; } 

(2)、 
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. 

(3)、 
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. 

24、IndexOf() 、LastIndexOf() 
查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如: 
str1.IndexOf("字"; //查找“字”在str1中的索引值(位置) 
str1.IndexOf("字串";//查找“字串”的第一个字符在str1中的索引值(位置) 
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置) 

25、Insert() 
在字串中指定索引位插入指定字符。如: 
str1.Insert(1,"字";在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”; 

26、PadLeft()、PadRight() 
在字串左(或右)加空格或指定char字符,使字串达到指定长度,如: 
<% 
string str1="中国人"; 
str1=str1.PadLeft(10,''1''); //无第二参数为加空格 
Response.Write(str1); //结果为“1111111中国人” , 字串长为10 
%> 

27、Remove() 
从指定位置开始删除指定数的字符 
字串对比一般都用: if(str1==str2){ } , 但还有别的方法: 

1、 
string str1; str2 
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: 
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"; } 

2、 
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. 

3、 
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. 

IndexOf() 
查找字串中指定字符或字串首次出现的位置,返首索引值,如: 
str1.IndexOf("字"; //查找“字”在str1中的索引值(位置) 
str1.IndexOf("字串";//查找“字串”的第一个字符在str1中的索引值(位置) 
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)  
loading...

 

2006-2-2
.NET开发中的一些小技巧


这篇文章来自是Mukund Pujari的《Some Cool Tips for .NET》,本人给大家翻译总结一下,我英语水平也就那么回事,不合适的地方还是请大家提出来。

1. 如何创建一个可改变大小没有标题栏的窗体?(How to create a form with resizing borders and no title bar?)

form1.Text = string. Empty; 
form1.ControlBox = false;


2. 如何在.NET的Windows窗体上启用XP主题集?(How to use XP Themes with Windows Forms using the .NET?)

确认你的控件中FlatStyle属性已经修改为System,再修改Main方法。

static void Main() 

  Application.EnableVisualStyles();
  Application.DoEvents(); 
  Application. Run(new Form1()); 



3. 如何为一个窗体设置一个默认按钮?(How to set the default button for a form?)

form1.AcceptButton = button1;

4. 如何为一个窗体设置一个取消按钮?(How to set the Cancel button for a form?)

form1.CancelButton = button1;

5. 如何阻止一个窗体标题显示在任务栏上?(How to prevent a form from being shown in the taskbar?)

设置窗体的ShowIntaskbar属性为False

6. 如何用现有可用字体绑定到ComboBox控件?(How to fill a ComboBox with the available fonts?)

comboBox1.Items.AddRange (FontFamily.Families);

7. 如何禁止TextBox控件默认的邮件菜单?(How to disable the default ContextMenu of a TextBox?)

textBox1.ContextMenu = new ContextMenu ();

8. 如何获取“我的文档”等一些系统文件夹路径?(How to get the path for "My Documents" and other system folders?)

Environment.SpecialFolder中包含了一些系统文件夹信息
MessageBox.Show(Environment.GetFolderPath( Environment.SpecialFolder.Personal ); 

9. 如何获取应用程序当前执行的路径?(How to get the path to my running EXE?)

string appPath = Application.ExecutablePath; 

10. 如何确定当前运行的系统?(How to determine which operating system is running?)

OperatingSystem os = Environment.OSVersion;
MessageBox.Show(os.Version.ToString());
MessageBox.Show(os.Platform.ToString());

11. 如何从完整的路径中获取文件名?(How to get a file's name from the complete path string?)

用System.IO.Path.GetFileName 和 System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法

12. 如何从完整的路径中获取文件扩展名?(How to get a file's extension from the complete path string?)

用System.IO.Path.GetExtension方法

13. 如何使没有选择日期的DateTimePicker控件为空文本?(How to make the DateTimePicker show empty text if no date is selected?)

dateTimePicker1.CustomFormat = " ";
dateTimePicker1.Format = DateTimePickerFormat.Custom;

14. 如何在Report Viewer中隐藏Crystal Report的状态栏?(How to hide the status bar of Crystal Report in Report Viewer?)

foreach(object obj in this.crystalReportViewer1.Controls)
{     
  if( obj.GetType()== typeof(System.Windows.Forms.StatusBar)) 
 {     
  StatusBar sBar=(StatusBar)obj;
  sBar.Visible=false;
 }     
}


15. 如何利用Crystal Report程序来生成PDF版本?(How to generate PDF version of Crystal Report programmatically?)

ReportDocument O_Report=new ReportDocument();
ExportOptions exportOpts = new ExportOptions();
PdfRtfWordFormatOptions pdfFormatOpts = new PdfRtfWordFormatOptions ();
DiskFileDestinationOptions diskOpts = new DiskFileDestinationOptions();
exportOpts = O_Report.ExportOptions;
// 设置PDF格式   
exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;
exportOpts.FormatOptions = pdfFormatOpts;
// 设置文件选项和导出
exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
diskOpts.DiskFileName = "C://Trial.pdf"; //设置PDF导出路径    
exportOpts.DestinationOptions = diskOpts;
O_Report.Export ();


16.通过代码如何输入多行文本?(How to enter multiline text in textbox through code? )

利用TextBox控件的LINES属性
string [] strAddress = {"Mukund Pujari","Global Transformation Technologies","Pune, India"};
textBox1.MultiLine=true;
textBox1.Lines=strAddress;

或者
textBox1.Text="Line 1/r/nLine2/r/nLine3.";

或者
用"System.Environment.NewLine"来替代换行符号

17. 如何在DataGrid中去掉CheckBox不确定状态?(How to remove the indeterminate status of checkbox in datagrid?)

DataGridTableStyle ts1 = new DataGridTableStyle(); //创建Table样式
ts1.MappingName = "Items"; //分配要应用样式的Data Table
DataGridColumnStyle boolCol = new DataGridBoolColumn(); // 创建CheckBox列
boolCol.MappingName = "ch"; //分配数据列名称
boolCol.AllowNull=false; // 修改AllowNull属性

18. 如何在用一个数据源DataTable绑定两个控件,确保变化不反映在两个控件中?( How to bind two controls to the same DataTable without having changes in one control also change the other control?)

我们在一个Form中放置一个ListBox和一个ComboBox控件,当数据源是一个DataTable而且绑定的ValueMember一致的时候我们选择ListBox中的一个Item时,ComboBox控件中的相同的Item也会被自动选中,我们可以采取建立新的上下文绑定对象来拒绝这样的同步操作
comboBox1.DataSource = dataset.Tables[ "Items" ]; 
comboBox1.ValueMember = "CustomerID"; 
comboBox1.DisplayMember = "CustomerID"; 

listBox1.BindingContext = new BindingContext(); // 设置新的上下文绑定对象
listBox1.DataSource = dataset.Tables[ "Items" ]; 
listBox1.ValueMember = "CustomerID"; 
listBox1.DisplayMember = "CustomerID";

19. 一个简单的创建链接字符串的方法。(An easy way to build connection string.)

记事本创建一个New.udl的文件,一个Microsoft 数据链接文件
双击打开,熟悉吧
按照向导创建完成一个数据库链接,测试成功
确定后,链接字符串写入这个文件,用记事本打开就看到了

20. 如何打开客户端E-Mail程序,Windows应用和Web应用?( How to open default E-mail client on your system with all parameters entered in it,like Outlook Express or Eudora, from your .NET windows or Web Application? )

Web Application:
A href="mailto:email@address1.com,email@address2.com?cc=email@address3.com&Subject=Hello&body=Happy New Year"

Windows Application:
引用System.Diagnostics.Process 命名空间
Process process = new Process();
process.StartInfo.FileName = "mailto:email@address1.com,email@address2.com?subject=Hello&cc=email@address3.com
&bcc=email@address4.com&body=Happy New Year" ;
process.Start();

21. VB.NET和C#有什么不同?( What is difference beween VB.NET and C#.NET? )

去微软下载一个文档吧,::URL::http://download.microsoft.com/download/6/3/5/6354bf47-c597-4029-89e9-2495e7539ab9/vbcsharpwp.exe

22. How to find whether your system has mouse or the number of buttons, whether it has wheel, or whether the mouse buttons are swapped or size of your monitor and many such information? 

23. 如何使Windows Form上的Panel或者Label控件半透明?(How to make a Panel or Label semi-transparent on a Windows Form? )

通过设置控件背景色的alpha值
panel1.BackColor = Color.FromArgb(65, 204, 212, 230);
注意:在设计时手动输入这些值,不要用颜色选取

24. C#程序的主函数写[STA Thread] 属性是什么目的?(What is the purpose of the [STA Thread] attribute for the Main method of a C# program? )

::URL::http://community.csdn.net/Expert/topic/4132/4132313.xml?temp=.2285272


25. 如何触发Button的Click事件?(How to trigger a button click event? )

button1.PerformClick();


loading...

 

2006-1-17
ASP.NET程式中常用的三十三種代碼二 [转]

18.日期格式化

  【aspx頁面內:<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date"%>

  顯示為: 2004-8-11 19:44:28

  我只想要:2004-8-11 】

<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}"%>
  應該如何改?

  【格式化日期】

  取出來,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd";

  【日期的驗證運算式】

  A.以下正確的輸入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] 

^((/d{2}(([02468][048])|([13579][26]))[/-///s]?((((0?[13578])|(1[02]))[/-///s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[/-///s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[/-///s]?((0?[1-9])|([1-2][0-9])))))|(/d{2}(([02468][1235679])|([13579][01345789]))[/-///s]?((((0?[13578])|(1[02]))[/-///s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[/-///s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[/-///s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(/s(((0?[1-9])|(1[0-2]))/[0-5][0-9])((/s)|(/[0-5][0-9])/s))([AM|PM|am|pm]{2,2})))?$
  B.以下正確的輸入格式:[0001-12-31], [9999 09 30], [2002/03/03] 

^/d{4}[/-///s]?((((0[13578])|(1[02]))[/-///s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[/-///s]?(([0-2][0-9])|(30)))|(02[/-///s]?[0-2][0-9]))$ 
  【大小寫轉換】

HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string)
  
19.如何設定全局變數

  Global.asax中

  Application_Start()事件中

  添加Application[屬性名] = xxx;

  就是你的全局變數

20.怎樣作到HyperLinkColumn生成的連接後,點擊連接,打開新窗口?

  HyperLinkColumn有個屬性Target,將器值設置成"_blank"即可.(Target="_blank"

  【ASPNETMENU】點擊功能表項彈出新窗口

  在你的menuData.xml文件的功能表項中加入URLTarget="_blank",如:

<?xml version="1.0" encoding="GB2312"?>
<MenuData ImagesBaseURL="images/"> 
<MenuGroup>
<MenuItem Label="內參資訊" URL="Infomation.aspx" >
<MenuGroup ID="BBC">
<MenuItem Label="公告資訊" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/>
<MenuItem Label="編制資訊簡報" URL="NewInfo.aspx" LeftIcon="file.gif" />
......
  最好將你的aspnetmenu升級到1.2版

21.讀取DataGrid控件TextBox值

foreach(DataGrid dgi in yourDataGrid.Items)
{
 TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId";
 tb.Text....
}
  23.在DataGrid中有3個模板列包含Textbox分別為 DG_ShuLiang (數量) DG_DanJian(單價) DG_JinE(金額)分別在5.6.7列,要求在錄入數量及單價的時候自動算出金額即:數量*單價=金額還要求錄入時限制為 數值型.我如何用客戶端腳本實現這個功能?

  〖思歸〗

<asp:TemplateColumn HeaderText="數量"> 
<ItemTemplate>
<asp:TextBox id="ShuLiang" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang"%>’ 
οnkeyup="javascriptoCal()"
/>

<asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^/d+$" />
</ItemTemplate>
</asp:TemplateColumn>

<asp:TemplateColumn HeaderText="單價"> 
<ItemTemplate>
<asp:TextBox id="DanJian" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian"%>’ 
οnkeyup="javascriptoCal()"
/>

<asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^/d+(/./d*)?$" />

</ItemTemplate>
</asp:TemplateColumn>

<asp:TemplateColumn HeaderText="金額"> 
<ItemTemplate>
<asp:TextBox id="JinE" runat=’server’ Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE"%>’ />
</ItemTemplate>
</asp:TemplateColumn><script language="javascript">
function DoCal()
{
 var e = event.srcElement;
 var row = e.parentNode.parentNode;
 var txts = row.all.tags("INPUT";
 if (!txts.length || txts.length < 3)
  return;

 var q = txts[txts.length-3].value;
 var p = txts[txts.length-2].value;

 if (isNaN(q) || isNaN(p))
  return;

 q = parseInt(q);
 p = parseFloat(p);

 txts[txts.length-1].value = (q * p).toFixed(2);
}
</script>

24.datagrid選定比較底下的行時,為什麼總是刷新一下,然後就滾動到了最上面,剛才選定的行因螢幕的關係就看不到了。

page_load 
page.smartNavigation=true

25.在Datagrid中修改數據,當點擊編輯鍵時,數據出現在文本框中,怎麼控制文本框的大小 ? 

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
 for(int i=0;i<e.Item.Cells.Count-1;i++)
  if(e.Item.ItemType==ListItemType.EditType)
  {
   e.Item.Cells[i].Attributes.Add("Width", "80px"
  } 
}
  
26.對話方塊

private static string ScriptBegin = "<script language=/"JavaScript/">";
private static string ScriptEnd = "</script>";

public static void ConfirmMessageBox(string PageTarget,string Content)
{
 string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}";

 ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;

 Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
 ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
 //Response.Write(strScript);
}

27. 將時間格式化:string aa=DateTime.Now.ToString("yyyy年MM月dd日"

  1.1 取當前年月日時分秒 

currentTime=System.DateTime.Now;
  1.2 取當前年 

int 年= DateTime.Now.Year;
  1.3 取當前月 

int 月= DateTime.Now.Month; 
  1.4 取當前日 

int 日= DateTime.Now.Day; 
  1.5 取當前時 

int 時= DateTime.Now.Hour; 
  1.6 取當前分 

int 分= DateTime.Now.Minute; 
  1.7 取當前秒 

int 秒= DateTime.Now.Second; 
  1.8 取當前毫秒 

int 毫秒= DateTime.Now.Millisecond; 
  
28.自定義分頁代碼:

  先定義變數 :

public static int pageCount; //總頁面數 
public static int curPageIndex=1; //當前頁面 
  下一頁: 

if(DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1)) 

 DataGrid1.CurrentPageIndex += 1; 
 curPageIndex+=1; 


bind(); // DataGrid1數據綁定函數 
  上一頁: 

if(DataGrid1.CurrentPageIndex >0) 

 DataGrid1.CurrentPageIndex += 1; 
 curPageIndex-=1; 


bind(); // DataGrid1數據綁定函數 
  直接頁面跳轉: 

int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()為跳轉值 

if(a<DataGrid1.PageCount) 

 this.DataGrid1.CurrentPageIndex=a; 


bind(); 

29.DataGrid使用: 

  添加刪除確認: 

private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) 

 foreach(DataGridItem di in this.DataGrid1.Items) 
 { 
  if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem) 
  { 
   ((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’確認刪除此項嗎?’);"
  } 
 } 

  樣式交替: 

ListItemType itemType = e.Item.ItemType; 

if (itemType == ListItemType.Item  

 e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;"; 
 e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; 

else if( itemType == ListItemType.AlternatingItem) 

 e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;"; 
 e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; 

  添加一個編號列: 

DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //執行sql返回的DataTable 
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"); 

for(int i=0;i<dt.Rows.Count;i++) 

 dt.Rows[i]["number"]=(i+1).ToString(); 


DataGrid1.DataSource=dt; 
DataGrid1.DataBind(); 
  DataGrid1中添加一個CheckBox,頁面中添加一個全選框 

private void CheckBox2_CheckedChanged(object sender, System.EventArgs e) 

 foreach(DataGridItem thisitem in DataGrid1.Items) 
 { 
  ((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked; 
 } 

  將當前頁面中DataGrid1顯示的數據全部刪除 

foreach(DataGridItem thisitem in DataGrid1.Items) 

 if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked) 
 { 
  string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString(); 
  Del (strloginid); //刪除函數 
 } 

  
30.當文件在不同目錄下,需要獲取數據庫連接字符串(如果連接字符串放在Web.config,然後在Global.asax中初始化) 

  在Application_Start中添加以下代碼: 

Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
   AppSettings["ConnStr"].ToString();
  
31. 變數.ToString() 

  字符型轉換 轉為字符串 

12345.ToString("n"; //生成 12,345.00 
12345.ToString("C"; //生成 ¥12,345.00 
12345.ToString("e"; //生成 1.234500e+004 
12345.ToString("f4"; //生成 12345.0000 
12345.ToString("x"; //生成 3039 (16進制) 
12345.ToString("p"; //生成 1,234,500.00% 
  
32、變數.Substring(參數1,參數2); 

  截取字串的一部分,參數1為左起始位數,參數2為截取幾位。 如:string s1 = str.Substring(0,2); 

  
33.在自己的網站上登陸其他網站:(如果你的頁面是通過嵌套方式的話,因為一個頁面只能有一個FORM,這時可以導向另外一個頁面再提交登陸資訊) 

<SCRIPT language="javascript"> 
<!-- 
 function gook(pws) 
 { 
  frm.submit(); 
 } 
//--> 

</SCRIPT> <body leftMargin="0" topMargin="0" οnlοad="javascript:gook()" marginwidth="0" marginheight="0"> 
<form name="frm" action=" ::URL::http://220.194.55.68:6080/login.php?retid=7259  " method="post"> 
<tr> 
<td>
<input id="f_user" type="hidden" size="1" name="f_user" runat="server">
<input id="f_domain" type="hidden" size="1" name="f_domain" runat="server">
<input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"> 

<INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng">
<INPUT id="tem" type="hidden" size="1" value="2" name="tem"> 

</td> 

</tr> 

</form> 
  文本框的名稱必須是你要登陸的網頁上的名稱,如果源碼不行可以用vsniffer 看看。 

  下面是獲取用戶輸入的登陸資訊的代碼: 

string name; 
name=Request.QueryString["EmailName"]; 

try 

 int a=name.IndexOf("@",0,name.Length); 
 f_user.Value=name.Substring(0,a); 
 f_domain.Value=name.Substring(a+1,name.Length-(a+1)); 
 f_pass.Value=Request.QueryString["Psw"]; 


catch 

 Script.Alert("錯誤的郵箱!"
 Server.Transfer("index.aspx"
}
loading...

 

2006-1-17
ASP.NET程式中常用的三十三種代碼一 [转]

1. 打開新的窗口並傳送參數: 

  傳送參數:

response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>"
  接收參數:

string a = Request.QueryString("id";
string b = Request.QueryString("id1";

2.為按鈕添加對話方塊

Button1.Attributes.Add("onclick","return confirm(’確認?’)";
button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}"

3.刪除表格選定記錄

int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()

4.刪除表格記錄警告

private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
{
 switch(e.Item.ItemType)
 {
  case ListItemType.Item :
  case ListItemType.AlternatingItem :
  case ListItemType.EditItem:
   TableCell myTableCell;
   myTableCell = e.Item.Cells[14];
   LinkButton myDeleteButton ;
   myDeleteButton = (LinkButton)myTableCell.Controls[0];
   myDeleteButton.Attributes.Add("onclick","return confirm(’您是否確定要刪除這條資訊’);";
   break;
  default:
   break;
 }

}

5.點擊表格行鏈結另一頁

private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 //點擊表格打開
 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);";
}
  雙擊表格連接到另一頁

  在itemDataBind事件中

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’";
}
  雙擊表格打開新一頁

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 string OrderItemID =e.item.cells[1].Text;
 ...
 e.item.Attributes.Add("ondblclick",&n
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值