当前位置: 首页 > 编程日记 > 正文

.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现

原文:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现

我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次,是打印的问题,将业务单据与数据报表打印出来。可想而知,即使一个业务功能非常完美齐全的管理软件,没有打印的支持,也一定不算是一个完整的软件。

对于打印,我们总是在用户打印之前可以看看打印的效果,这时,一般的软件都提供了打印预览;如果需要调整打印的效果如纸张的大小、边距的设置,又提供了页面设置对话框让用户选择和调整;如果系统有多个打印机,当用户单击打印按钮时还可以选择输出的对象。

总之,对于打印,我们至少要提供打印页面设置、打印机设置、打印预览对话框,让用户有更多的机会参与交互。这一些,是一个打印模块比较重要也比较基本的东西,让我们一起来实现它们吧。

进入Vs2003 IDE,从文件菜单上单击新建项目,项目类型为C#,在模板中选择类库,名称估且叫GoldPrinter,确定即可。在打开的开发环境中,删除解决方案资源管理器中默认生成的Class1.cs。

现在,我们要考虑一下,对于打印,可能是在Windows下,也可能是Web下。如果将两者的方法统一起来,让调用者不用操心是什么方式下那该多好啊。因此,我们首先设计一个接口,提供两者共用的方法。
 
  在项目上鼠标右键单击后添加一个新类,名称为:IPrinterPageSetting,由于是接口,将class改为interface,并去掉构造函数。看上去应类似如下:
using System;
namespace GoldPrinter
{
 /// <summary>
 /// IPrinterPageSetting 的摘要说明。
 /// </summary>
 public class IPrinterPageSetting
 {
  
 }
}


方法中至少包含三个声明即ShowPageSetupDialog()、ShowPrintSetupDialog()、ShowPrintPreviewDialog(),也就是打开打印页面设置、打印机设置、打印预览对话框。
 
  Vs2003为我们提供了一个PrintDocument,名字空间是System.Drawing.Printing。PrintDocument是为打印而提供的一个类,它的概述(summary)是这样的:定义一个可再次使用的对象,该对象将输出发送到打印机。

PrintDocument为我们封装了很多复杂的细节,它有一个至关重要的事件叫PrintPage,PrintPage的概述是:当需要为当前页打的输出时发生。因此,我们只要引发了打印事件,把打印的具体输出的对象交给PrintPage,别的我们就不用操心了。

那么,我们怎么实现具体输出的过程呢?由于是封装,我们也不可能知道最终用户具体怎么去实现,这时,委托(Delegate)为我们起了大的作用。大家都知道一个函数实现某个功能的时候往往需要一些输入的数据,但是函数本身并不知道这些数据到底是哪个具体的值,只知道这个值的数据类型,这时引入了参数,调用者调用函数据的时候传入相应类型的具体值就行了。大家应该意识到了我的用意,与函数类似,我们为打印提供了关联打印机的方法,但是具体的实现只有由调用者去实现,不同之处是函数传递的是参数,而我们要做的委托传递的是方法。这时,我们只要为两者建立对应关系就可以了,这就是委托。我们需要定义一个委托,参数类型与PrintPage的一致就可以了,即(Object obj,System.Drawing.Printing.PrintPageEventArgs ev)。

由此可见,我们需要做下面的一些事情:
  1、在项目的引用处添加引用,在弹出的对话框的.NET标签中选择System.Drawing.dll,
     原因是PrintDocument的名字空间是System.Drawing.Printing,在System.Drawing.dll实现;
  2、在IPrinterPageSetting接口中增加PrintDocument属性的声明;
  3、定义委托
  4、在IPrinterPageSetting接口中增加PrintPage属性的声明,类型为定义的委托;

以下是IPrinterPageSetting接口文件内容:

using System;
using System.Drawing;
using System.Drawing.Printing;

namespace GoldPrinter
{
 /// <summary>
 /// PrintDocument.PrintPage的委托定义
 /// </summary>
 public delegate void PrintPageDelegate(Object obj,System.Drawing.Printing.PrintPageEventArgs ev) ;

/// <summary>
 /// IPrinterPageSetting 的接口,显示打印纸张设置、打印机设置、打印预览对话框。
 /// 程序提供:周方勇;Email:flygoldfish@sina.com。
 /// </summary>
 public interface IPrinterPageSetting
 {
  /// <summary>
  /// 获取或设置打印文档
  /// </summary>
  System.Drawing.Printing.PrintDocument PrintDocument
  {
   get;
   set;
  }

/// <summary>
  /// 关联一个方法,目的是让具体的打印由实例化者来操作
  /// 如PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
  /// </summary>
  PrintPageDelegate PrintPage
  {
   get;
   set;
  }

/// <summary>
  /// 显示页面设置对话框,并返回PageSettings
  /// </summary>
  /// <returns></returns>
  System.Drawing.Printing.PageSettings ShowPageSetupDialog();

/// <summary>
  /// 显示打印机设置对话框,并返回PrinterSettings
  /// </summary>
  /// <returns></returns>
  System.Drawing.Printing.PrinterSettings ShowPrintSetupDialog();

/// <summary>
  /// 显示打印预览对话框
  /// </summary>
  void ShowPrintPreviewDialog();

}//End Interface
}//End NameSpace


  下面,我们以Windows下的编程方式实现,同时也列Web编程下的框架。由于是Windows下的编程,我们可能用到对话框什么的作为错误提示,因此,我们同理要加入System.Windows.Forms.dll引用。再建立一个类文件,名称为WinPrinterPageSetting。进入文件后,在类声明后面加上:IPrinterPageSetting,实现接口功能。程序清单如下,程序中有很多注释,这里不再多说。

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace GoldPrinter
{
 /// <summary>
 /// WinForm下的打印纸张设置、打印机设置、打印预览对话框。
 /// </summary>
 public class WinPrinterPageSetting:IPrinterPageSetting
 {
  //把PrintPage委托声明为类的一个成员变量
  private PrintPageDelegate _printPage;  
  // 打印文档
  private PrintDocument _printDocument;

#region 构造函数
  public WinPrinterPageSetting():this(null)
  {
   
  }

/// <summary>
  /// 使用printDocument来初始化类的新实例,当printDocument为null时自动创建一个printDocument的实例
  /// </summary>
  /// <param name="printDocument"></param>
  public WinPrinterPageSetting(PrintDocument printDocument)
  {
   if (printDocument != null)
   {
    _printDocument = printDocument;
   }
   else
   {
    _printDocument = new PrintDocument();
   }
  }
  #endregion


  #region IPrinterPageSetting 成员

/// <summary>
  /// 获取或设置打印文档
  /// </summary>
  public PrintDocument PrintDocument
  {
   get
   {
    return this._printDocument;
   }
   set
   {
    this._printDocument = value;
   }
  }

/// <summary>
  /// 一定要实例化此类后在调用打印/预览之前设置此属性,使之关联一个方法,目的是让具体的打印由实例化者来操作
  /// 如PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
  /// </summary>
  public PrintPageDelegate PrintPage
  {
   set
   { 
    //初始委托变量,关联方法
    _printPage = value;
    
    if (_printDocument==null)
    {
     throw new Exception("关联的打印文档不能为空!");
    }
    _printDocument.PrintPage +=new System.Drawing.Printing.PrintPageEventHandler(this._printPage);
   }
   get
   {
    return _printPage;
   }  
  }

/// <summary>
  /// 显示页面设置对话框,并返回PageSettings
  /// </summary>
  /// <returns></returns>
  public PageSettings ShowPageSetupDialog()
  {
   return ShowPageSetupDialog(this._printDocument);
  }

/// <summary>
  /// 显示打印机设置对话框,并返回PrinterSettings
  /// </summary>
  /// <returns></returns>
  public PrinterSettings ShowPrintSetupDialog()
  {
   return ShowPrintSetupDialog(this._printDocument);
  }

/// <summary>
  /// 显示打印预览对话框
  /// </summary>
  public void ShowPrintPreviewDialog()
  {
   ShowPrintPreviewDialog(this._printDocument);
  }

#endregion


 
  //***************注意:以下几个对话框方法可以独立使用***************
  #region 页面设置对话框 protected virtual PageSettings ShowPageSetupDialog(PrintDocument printDocument)
  /// <summary>
  /// 页面设置对话框,可以独立使用
  /// </summary>
  /// <param name="printDocument"></param>
  /// <returns></returns>
  /// <remarks>
  /// 作    者:周方勇
  /// 修改日期:2004-08-07
  /// </remarks>
  protected virtual PageSettings ShowPageSetupDialog(PrintDocument printDocument)
  {
   //声明返回值的PageSettings
   PageSettings ps = new PageSettings();

if (printDocument==null)
   {
    throw new Exception("关联的打印文档不能为空!");
   }

try
   {
    //申明并实例化PageSetupDialog
    PageSetupDialog psDlg = new PageSetupDialog();
    
    //相关文档及文档页面默认设置
    psDlg.Document = printDocument;
    psDlg.PageSettings = printDocument.DefaultPageSettings;

//显示对话框
    DialogResult result = psDlg.ShowDialog();
    if (result == DialogResult.OK)
    {
     ps = psDlg.PageSettings;
     printDocument.DefaultPageSettings = psDlg.PageSettings;
    }

}
   catch(System.Drawing.Printing.InvalidPrinterException e)
   {
    MessageBox.Show("未安装打印机,请进入系统控制面版添加打印机!","打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message,"打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }

return ps;
  }
  #endregion


  #region 打印设置对话框 protected virtual PrinterSettings ShowPrintSetupDialog(PrintDocument printDocument)
  /// <summary>
  /// 打印设置对话框,可以独立使用
  /// </summary>
  /// <param name="printDocument"></param>
  /// <returns></returns>
  /// <remarks>
  /// 作    者:周方勇
  /// 修改日期:2004-08-07
  /// </remarks>
  protected virtual PrinterSettings ShowPrintSetupDialog(PrintDocument printDocument)
  {
   //声明返回值的PrinterSettings
   PrinterSettings ps = new PrinterSettings();
   if (printDocument==null)
   {
    throw new Exception("关联的打印文档不能为空!");
   }

try
   {
    //申明并实例化PrintDialog
    PrintDialog pDlg = new PrintDialog();
    
    //可以选定页
    pDlg.AllowSomePages = true;

//指定打印文档
    pDlg.Document = printDocument;

//显示对话框
    DialogResult result = pDlg.ShowDialog();
    if (result == DialogResult.OK)
    {
     //保存打印设置
     ps = pDlg.PrinterSettings;
     //打印
     printDocument.Print();
    }

}
   catch(System.Drawing.Printing.InvalidPrinterException e)
   {
    MessageBox.Show("未安装打印机,请进入系统控制面版添加打印机!","打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message,"打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }

return ps;
  }
  #endregion


  #region 打印预览对话框 protected virtual void ShowPrintPreviewDialog(PrintDocument printDocument)
  /// <summary>
  /// 打印预览对话框,可以独立使用
  /// </summary>
  /// <param name="printDocument"></param>
  /// <returns></returns>
  /// <remarks>
  /// 作    者:周方勇
  /// 修改日期:2004-08-07
  /// </remarks>
  protected virtual void ShowPrintPreviewDialog(PrintDocument printDocument)
  {
   if (printDocument==null)
   {
    throw new Exception("关联的打印文档不能为空!");
   }

try
   {
    //申明并实例化PrintPreviewDialog
    PrintPreviewDialog ppDlg = new PrintPreviewDialog();
    
    //指定打印文档
    ppDlg.Document = printDocument;


    //显示对话框
    DialogResult result = ppDlg.ShowDialog();
    if (result == DialogResult.OK)
    {
     //...
    }

}
   catch(System.Drawing.Printing.InvalidPrinterException e)
   {
    MessageBox.Show("未安装打印机,请进入系统控制面版添加打印机!","打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message,"打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
   }
  }
  #endregion

}//End Class
}//End NameSpace


  大家可以看到了#region指定,它与#endregion一起使用,可以把中间的文本折叠起来,很方便,需要查看的时候就单击前面的展开符号。后三个函数是比较重要的方法,同时提供它们的重载函数。ShowPageSetupDialog()与ShowPrintSetupDialog()返回用户确认的当前设置选择。


  再建立一个类文件,名称为WebPrinterPageSetting。进入文件后,在类声明后面加上:IPrinterPageSetting,实现接口功能。程序清单如下:

using System;

namespace GoldPrinter
{
 /// <summary>
 /// WebForm下的打印纸张设置、打印机设置、打印预览对话框。(***暂无具体实现***)
 /// </summary>
 public class WebPrinterPageSetting:IPrinterPageSetting
 {
  public WebPrinterPageSetting()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

#region IPrinterPageSetting 成员

public System.Drawing.Printing.PrintDocument PrintDocument
  {
   get
   {
    // TODO:  添加 WebPrinterPageSetting.PrintDocument getter 实现
    return null;
   }
   set
   {
    // TODO:  添加 WebPrinterPageSetting.PrintDocument setter 实现
   }
  }

public PrintPageDelegate PrintPage
  {
   get
   {
    // TODO:  添加 WebPrinterPageSetting.PrintPage getter 实现
    return null;
   }
   set
   {
    // TODO:  添加 WebPrinterPageSetting.PrintPage setter 实现
   }
  }

public System.Drawing.Printing.PageSettings ShowPageSetupDialog()
  {
   // TODO:  添加 WebPrinterPageSetting.ShowPageSetupDialog 实现
   return null;
  }

public System.Drawing.Printing.PrinterSettings ShowPrintSetupDialog()
  {
   // TODO:  添加 WebPrinterPageSetting.ShowPrintSetupDialog 实现
   return null;
  }

public void ShowPrintPreviewDialog()
  {
   // TODO:  添加 WebPrinterPageSetting.ShowPrintPreviewDialog 实现
  }

#endregion

}//End Class

}//End NameSpace


  做到了这一步,大家可能说已经可以了,确实如此。因为在调用的时候实例化WinPrinterPageSetting/WebPrinterPageSetting并调用它的方法或属性就可以了。大家再想想我为什么要提供IPrinterPageSetting呢?如果我现在调用打印对话框,我也不管是Windows下还是Web下的,这时,IPrinterPageSetting就发挥了作用。

例如:
IPrinterPageSetting _printerPageSetting;
申明了一个打印接口对象,以后就可以直接调用它的方法了,但是到底是Windows模式还是Web模式呢,我们只需要让程序自己去根据系统去实例为真正的WinPrinterPageSetting或WebPrinterPageSetting了。如:

//创建接口对象的新实例,使其指象真正的实现其接口的对象
if (Windows模式)
{
 _printerPageSetting = new WinPrinterPageSetting();
}
else if(Web模式)
{
 _printerPageSetting = new WebPrinterPageSetting();
}
在接下来的程序清单中我们可以看到这个效果。我们再建立一个PrinterPageSetting类,将WinPrinterPageSetting与WebPrinterPageSetting合二为一。在类的构造函数中增加自动判断Windows模式还是Web模式,同时也提供PrintMode属性可以让用户修改。程序清单如下:


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace GoldPrinter
{

/// <summary>
 /// 打印方式
 /// </summary>
 public enum PrintModeFlag
 {
  /// <summary>
  /// Windows窗口打印方式
  /// </summary>
  Win
   ,
  /// <summary>
  /// Web窗口打印方式
  /// </summary>
  Web 
 }

/// <summary>
 /// 封装页面设置、打印机设置、打印预览,适合于Window和Asp.Net。
 /// 程序提供:周方勇;Email:flygoldfish@sina.com。
 /// </summary>
 public class PrinterPageSetting
 {
  //申明一个封装页面设置、打印机设置、打印预览的接口
  private IPrinterPageSetting _printerPageSetting;

//打印方式
  private PrintModeFlag _printModeFlag;

public PrintModeFlag PrintMode
  {
   get
   {
    return this._printModeFlag;
   }
   set
   {
    this._printModeFlag = value; 
   //运用了抽象模式,创建接口对象的新实例,使其指象真正的实现其接口的对象
   if (this._printModeFlag == PrintModeFlag.Win)
   {
    _printerPageSetting = new WinPrinterPageSetting();
   }
   else if(this._printModeFlag == PrintModeFlag.Web)
   {
    _printerPageSetting = new WebPrinterPageSetting();
   }
   }
  }

/// <summary>
  /// 获取或设置打印文档
  /// </summary>
  public PrintDocument PrintDocument
  {
   get
   {
    return _printerPageSetting.PrintDocument;
   }
   set
   {
    _printerPageSetting.PrintDocument = value;
   }
  }


  /// <summary>
  /// 一定要实例化此类后在调用打印/预览初始此变量,使之关联一个方法,目的是让具体的打印由实例化者来操作
  /// 如PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
  /// </summary>
  public PrintPageDelegate PrintPage
  {
   set
   { 
    _printerPageSetting.PrintPage = value;
   }
   get
   {
    return _printerPageSetting.PrintPage;
   }
  }

#region 构造函数
  /// <summary>
  ///  封装页面设置、打印机设置、打印预览,适合于Window和Asp.Net,Web方式下请在配置文件中增加键PrintMode及值Web,也可以实例化后设置PrintMode属性为PrintModeFlag.Web。
  /// </summary>
  public PrinterPageSetting():this(null)
  {
   
  }

/// <summary>
  ///  封装页面设置、打印机设置、打印预览,适合于Window和Asp.Net,Web方式下请在配置文件中增加键PrintMode及值Web,也可以实例化后设置PrintMode属性为PrintModeFlag.Web。
  /// </summary>
  /// <param name="printDocument"></param>
  public PrinterPageSetting(PrintDocument printDocument)
  {
   string strPrintMode = "";

//配置文件中键PrintMode
   strPrintMode = System.Configuration.ConfigurationSettings.AppSettings["PrintMode"];

if (strPrintMode == null)
   {
    //默认为Win方式   
    strPrintMode = "Win";
   }

//配置文件中键PrintMode的值Win/Web
   if (strPrintMode.ToUpper() == "WIN")
   {
    this.PrintMode = PrintModeFlag.Win;
   }
   else
   {
    this.PrintMode = PrintModeFlag.Web;   
   }

/*  //配置文件中添加键值的写法
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <appSettings>
       <add key="PrintMode" value="Web"/> 
     </appSettings>
    </configuration>
   */

_printerPageSetting.PrintDocument = printDocument;

}
  #endregion


  /// <summary>
  /// 显示页面设置对话框,并返回PageSettings
  /// </summary>
  /// <returns></returns>
  public PageSettings ShowPageSetupDialog()
  {
   return _printerPageSetting.ShowPageSetupDialog();
  }

/// <summary>
  /// 显示打印机设置对话框,并返回PrinterSettings
  /// </summary>
  /// <returns></returns>
  public PrinterSettings ShowPrintSetupDialog()
  {
   return _printerPageSetting.ShowPrintSetupDialog();  
  }

/// <summary>
  /// 显示打印预览对话框
  /// </summary>
  public void ShowPrintPreviewDialog()
  {
   _printerPageSetting.ShowPrintPreviewDialog();
  }

}//End Class
}//End NameSpace

在这个类的构造函数中,提到了配置文件。在建立Asp.Net应用程序的时候自动会生成一个名为WebMIS.Config的文件,文件里有一些环境和其它信息的设置,可以简单的理解为为程序提供一个外部设置的接口,提高应用程序的灵活性。在建立Windows应用程序的时候默认情况下没有这样的文件,但是可以在项目上单击鼠标右键添加新项,选择应用程序配置,默认的配置文件名为App.config。在构造函数中我们默认为Win下的打印,如果是Web方式下,可以在配置文件中增加键PrintMode及值Web,也可以实例化后设置PrintMode属性为PrintModeFlag.Web。下面是在配置文件中添加键值的写法
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <appSettings>
       <add key="PrintMode" value="Web"/>
     </appSettings>
    </configuration>

至此,关于NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现全部结束,我们可以将程序编译成一个动态库了。在接下来的文章中,我们一起看看怎么应用这个动态库,并且以一个完整的单据、报表打印程序为例进一步说明。

相关文章:

Silverlight 2 beta 2 中目前不支持共享 WCF 的客户端类型

在调用多个 WCF Service 的时候经常会遇到的一个问题是&#xff0c;某些同样的类型因为在不同的 Service 里用到&#xff0c;就被重复生成了好几个版本的代理类型&#xff0c;分别处在不同的名称空间下。这样&#xff0c;如果一个操作需要同时调用几个 Service&#xff0c;就会…

Matlab与线性代数 -- 逆矩阵

本微信图文详细介绍了Matlab中各种求逆矩阵的方法。

使用intellij idea制作可执行jar文件

可执行jar文件 一个可执行的 jar文件是一个自包含的 Java 应用程序&#xff0c;它存储在特别配置的 JAR 文件中&#xff0c;可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序&#xff0c;必须将它加入到您的类路径中&#xf…

c# 一些控件常用屬性

Form&#xff1a;ControlBox&#xff1a;移除窗體按鈕(最大化、最小化、關閉組&#xff09;&#xff0c;並從左側移除「系統菜單」Opacity&#xff1a;控制窗體透明度ActiveControl&#xff1a;指出窗體上當前哪一個擦傷擁有焦點BackColor&#xff1a;窗體中任何文本和圖形的默…

centos设置固定IP方法

首先网络模式设为桥接 [rootcentos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0HWADDR00:0C:29:80:9D:41TYPEEthernetUUID29784981-a8cc-4405-8923-264df546350eONBOOTyesNM_CONTROLLEDyesBOOTPROTOstatic #设为静态的IPADDR192.168.0.99 #设置固定ipNETMA…

如何利用离散Hopfield神经网络进行数字识别(1)

如何利用离散Hopfield神经网络进行数字识别&#xff0c;代码部分。

You can't specify target table for update in FROM clause

今天使用mysql,写出一个sql语句&#xff1a; update service_re set is_deleted0 where id(select id from service_re where p_id21000122321 limit 1);执行这样的sql会报一个异常&#xff1a; You cant specify target table for update in FROM clause 查了资料&#xf…

在C# Express 2005中配置 NUnit

在C# Express 2005中配置 NUnit www.cnblogs.com/Pamigo/ 2008-7-28 在网上有很多关于在C#中使用NUnit的相关文章&#xff0c;但是我安装了NUnit后却不知道在C# Express中应该如何配置&#xff0c;相信很多人也遇到了同样的问题。根据自己的摸索总结了一下&#xff0c;希望对大…

如何利用离散Hopfield神经网络进行数字识别(2)

如何利用离散Hopfield神经网络进行数字识别

SQL语句实现取消自增列属性

由于在SQL-SERVER中&#xff0c;自增列属性不能直接修改&#xff0c;但可以通过以下方式变向实现 1、如果仅仅是指定值插入&#xff0c;可用以下语句&#xff0c;临时取消 SET IDENTITY_INSERT TableName ONINSERT INTO tableName(xx,xx) values(xx,xx)SET IDENTITY_INSERT Tab…

Mac OS 提高工作效率的几个快捷键

Mac OS X 命令行中组快捷键 几组导航快捷键 跳至行首 – ControlA 跳至行尾 – ControlE 跳至上一个单词 – Control<- 跳至下一个单词 – Control-> 跳至下一行 – ControlN 跳至上一行 – ControlP 删除上一个单词 – ControlW 删除当前光标位置到行首的文字 – Cont…

什么是离散的Hopfield网络?

什么是离散的Hopfield网络&#xff1f;

《OpenStack实战》——第1章 介绍OpenStack 1.1OpenStack是什么

本节书摘来自异步社区《OpenStack实战》一书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a; 【美】V. K. Cody Bumgardner&#xff08;V. K. 科迪•布姆加德纳&#xff09;著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 第一部分 入门指南 本…

【转】 一些NET的实用类,不错

http://www.cnblogs.com/9who/archive/2008/08/01/1258248.html转载于:https://www.cnblogs.com/niuniu502/archive/2008/08/01/1258331.html

/dev/null

把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用. 禁止标准输出. 1 cat $filename >/dev/null2 # 文件内容丢失&#xff0c;而不会输出到标…

backup restore On Ubuntu

详见&#xff1a;https://help.ubuntu.com/community/BackupYourSystem/TAR 在 使用Ubuntu之前&#xff0c;相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统&#xff0c;那么你一定记忆犹新&#xff1a;首先需要找到一个备份工 具(通常都是私有软件)&#xff…

.net 连接ORACLE 数据库的例子

利用 System.Data.OracleClient.Dll 的组件进行连接&#xff1a; 首先配置WebConfig 文件&#xff1b; <connectionStrings> <add name"oracleconn" connectionString"Data Source"";User IDryq;Password123456" providerName&quo…

什么是SESSION?(一)

本图文通过三个问题的回答&#xff0c;详细介绍了Session的机制。本图文由钟锦提供。

linux下字符串处理工具一:grep

grep常见选项 grep -A &#xff1a;显示匹配行和之后的几行 grep -A 4 "NullPointerException" test.log 找到NullPointerException之后的几行-c &#xff1a;打印匹配到的行数 c:count[adminv069164233.sqa.<pre name"code" class"html"&…

Matlab与随机变量和样本的数字特征

本文主要介绍了常见分布的期望和方差以及样本的数字特征。贡献人为孔令才。

C#的方法的参数修饰符详解

方法参数修饰 (啥也没有) 如果参数的修饰是啥也没有&#xff0c;那么其参数传递的方式是值传递&#xff0c;接受方收到的是原始数据的拷贝 out 说明了参数是引用传递。 params 可变参&#xff0c;注意了这种修饰符针对的参数一定是最后一个参数 ref 引用传递&#xff0c;参数的…

wps 2016 个人版 重新开始编号

wps文档重新开始编号&#xff0c;继续编号&#xff0c;自定义编号 首先选中这一行鼠标右键选中项目符号和编号单击项目符号和编号&#xff0c;你可以重新开始编号为1&#xff0c;继续前一列表&#xff0c;还可自定义&#xff0c;单击确定按钮就可以实现你想要的结果效果图转载于…

Sublime Text保存文件时自动去掉行末空格

1.安装DeleteBlankLines 插件 通过ctrlshiftp组合键打开命令面板 输入install packge后回车 输入DeleteBlankLines后回车进行安装 Sublime Tex去除空白行插件DeleteBlankLines 上文所述安装DeleteBlankLines插件的前提&#xff1a;Package Control已经安装好。 3.Subl…

六步使用ICallbackEventHandler实现无刷新回调

AJAX技术所提倡的无刷新回调&#xff0c;在原来的技术中需要写大量的JavaScript代码或使用一些AJAX框架&#xff0c;使得开发效率和可维护性大大降低。其实ASP.NET2.0中&#xff0c;已经提供了这样的接口&#xff0c;这就是ICallbackEventHandler。关于ICallbackEventHandler网…

Matlab与线性代数 -- 矩阵的特征值与特征向量

本图文详细介绍了Matlab中求方阵特征值与特征向量的方法。

mybatis3进行模糊查询的总结

一种直接采用函数进行模糊查询&#xff0c;直接在映射文件中书写对应的like语句。 例如&#xff1a; select * from u_tree ut where ut.node_name like concat(concat(‘%,#{text}),’%&#xff09; 第二种方式&#xff1a; 使用 ${...} 代替 #{...} SELECT * FROM tableName …

linux下字符串处理工具二:awk(1)

awk工作原理 原理图 第一步&#xff1a;awk对文件或管道的内容一次只处理一次&#xff0c;将获取到的这一行赋给内部变量$0。 第二步&#xff1a;这一行的内容按awk内部变量FS定义的分隔符&#xff0c;缺省为空格(包括tab制表符)分解成字段&#xff0c;每一段存储在从$1开…

后台接口向数据库录入汉字时乱码以及自动过滤文字经验总结

本人第一次写博客&#xff0c;而且是一个菜鸟&#xff0c;如果有什么不完善的地方请前辈们多多指教。 2017-06-01 21:56:05 因为公司功能的需求&#xff0c;需要写一个溯源信息的接口&#xff0c;下面的代码是前台的一个用户评论的界面。所谓溯源就是追溯源头&#xff0c;有点类…

PHP新手上路(六)

5.5 计数器 让我们在首页上加上一个计数器。这个例子已经被讲过多次了&#xff0c;但是还是有利于演示怎样读写文件以及创建自己的函数。counter.inc包含以下代码&#xff1a; <? /* || 一个简单的计数器 */ function get_hitcount($counter_file) { /…

如何教计算机认识手写数字(下)

本文详细介绍了如何利用C#语言编写KDTree结构加速KNN算法来处理手写字符的识别问题。本文由安晟提供。