一个窗体往往会显示其他窗体以实现一定的功能。通过在被调用窗体中实现一个静态函数供调用窗体使用可以简化窗体间的交互,隐蔽被调用窗体的数据,从而加强封装特性。
如主窗体为FormMain,被调用窗体为FormChild。在FormChild中实现一个静态方法:
Static void DoSomething()
{
new FormChildShowDialog();
//实现功能
//…
}
在主窗体中调用被调用窗体的DoSomething()方法:
FormChindDoSomething();
这样就可以显示被调用窗体并由被调用窗体执行预设的功能,并且该静态函数封装了构造和初始化被调用窗体的逻辑。程序的结构更加清晰,类的职责更加明确。
(2) 判断用户在对话框中点击的按钮
对话框的ShowDialog方法会返回DialogResult类型的返回值。DialogResult是枚举类型,通过检查该枚举值,即可知道用户是通过单击哪个按钮关闭对话框的。
例如,要检测用户是否是单击了OK按钮从而关闭文件对话框,可以使用如下代码:
if (thisopenFileDialogPhotoShowDialog()==DialogResultOK)
{
…
}
(3) 将数据库中读取的照片文件显示在控件中
从数据库中读取照片,照片的列rowphptoImage是byte 数组类型。要将照片直接显示在控件中,而非先存储在硬盘上再调入控件显示,需要使用MemoryStream类。具体方法如下:
MemoryStream mstream;
if(rowphotoImageLength!=0)
{
mstream=new MemoryStream(rowphotoImage);
thispicPhotoImage= new Bitmap(mstream);
}
(4) 使用 Command 对象的 ExecuteScalar 方法
一般使用 Command 对象的 ExecuteReader 方法来将数据库的返回结果保存在 DataReader 中。如以下代码所示:
dbReader = cmdExecuteReader();
但如果返回结果是单个标量值,如一个整数或一个字符串,则可以执行 Command 对象的 ExecuteScalar 方法直接获取该值。
编码示例如下:
byte b;
b = (byte)cmdExecuteScalar();
(5) 为 Command 对象添加参数的两种方法
这两种方法其实是 Parameters 对象的 Add 方法的两种变体。第一种方法比较简单,就是直接使用 Add 方法添加参数,并同时指定参数的类型和值。代码如下:
cmdParametersAdd("@EmpID",SystemDataSqlDbTypeInt)Value = iEmpID;
另外一种方法比较复杂,它需要先声明一个 SqlParameter 类型的对象,然后使用 Add 方法添加该参数对象。这种方法便于调试。代码如下:
SqlParameter paramEmpID = new SqlParameter("@EmpID", SystemDataSqlDbTypeInt);
paramEmpIDValue = strSelfIntro;
cmdParametersAdd(paramEmpID);
(6) 解决Typed DataSet中空字段值的问题
Typed DataSet可以大大提高开发的效率。但是在某个字段值为空的情况下,使用Typed DataSet读取该字段会引发系统异常。要解决这个问题有两种方法:
1) 在数据库中为所有运行为空的字段设置缺省值
2) 修改VSNET自动生成的XSD文件
在这里仅介绍第二种方法。对于值可以为空的字段,XSD文件中原来的描述应该类似如下代码(其中DeptName、Title和Telephone字段在数据库中可以为空值):
<xs:elementname="Name"type="xs:string"/>
<xs:elementname="LoginName"type="xs:string"/>
<xs:elementname="Email"type="xs:string"/>
<xs:elementname="DeptName"type="xs:string"minOccurs="0"/>
<xs:elementname="Title"type="xs:string"minOccurs="0"/>
<xs:elementname="Telephone"
文章出处:>
问一句,你是调用还是直接嵌入?下面是直接嵌入的,你改改,这是我以前用到的
using System;
using SystemCollections;
using SystemComponentModel;
using SystemDrawing;
using SystemData;
using SystemWindowsForms;
using SystemRuntimeInteropServices;
namespace WinWordControl
{
public class DocumentInstanceException : Exception
{}
public class ValidDocumentException : Exception
{}
public class WordInstanceException : Exception
{}
public class WinWordControl : SystemWindowsFormsUserControl
{
[DllImport("user32dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
[DllImport("user32dll")]
static extern int SetParent( int hWndChild, int hWndNewParent);
[DllImport("user32dll", EntryPoint="SetWindowPos")]
static extern bool SetWindowPos(
int hWnd, // handle to window
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags // window-positioning options
);
[DllImport("user32dll", EntryPoint="MoveWindow")]
static extern bool MoveWindow(
int爃Wnd,
int X,
int Y,
int爊Width,
int爊Height,
bool燽Repaint
);
const int SWP_DRAWFRAME = 0x20;
const int SWP_NOMOVE = 0x2;
const int SWP_NOSIZE = 0x1;
const int SWP_NOZORDER = 0x4;
private WordDocument document;
private static WordApplicationClass wd = null;
public static int wordWnd = 0;
private static string filename = null;
private static bool deactivateevents = false;
/// <summary>
/// needed designer variable
/// </summary>
private SystemComponentModelContainer components = null;
public WinWordControl()
{
InitializeComponent();
}
/// <summary>
/// cleanup Ressources
/// </summary>
protected override void Dispose( bool disposing )
{
CloseControl();
if( disposing )
{
if( components != null )
componentsDispose();
}
baseDispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// !do not alter this code! It's designer code
/// </summary>
private void InitializeComponent()
{
//
// WinWordControl
//
thisName = "WinWordControl";
thisSize = new SystemDrawingSize(440, 336);
thisResize += new SystemEventHandler(thisOnResize);
}
#endregion
/// <summary>
/// Preactivation
/// It's usefull, if you need more speed in the main Program
/// so you can preload Word
/// </summary>
public void PreActivate()
{
if(wd == null) wd = new WordApplicationClass();
}
/// <summary>
/// Close the current Document in the control --> you can
/// load a new one with LoadDocument
/// </summary>
public void CloseControl()
{
/
this code is to reopen Word
/
try
{
deactivateevents = true;
object dummy=null;
documentClose(ref dummy, ref dummy, ref dummy);
documentApplicationQuit(ref dummy, ref dummy, ref dummy);
deactivateevents = false;
}
catch
{
}
}
/// <summary>
/// catches Word's close event
/// starts a Thread that send a ESC to the word window ;)
/// </summary>
/// <param name="doc"></param>
/// <param name="test"></param>
private void OnClose(WordDocument doc, ref bool chancel)
{
if(!deactivateevents)
{
chancel=true;
}
}
/// <summary>
/// catches Word's open event
/// just close
/// </summary>
/// <param name="doc"></param>
private void OnOpenDoc(WordDocument doc)
{
OnNewDoc(doc);
}
/// <summary>
/// catches Word's newdocument event
/// just close
/// </summary>
/// <param name="doc"></param>
private void OnNewDoc(WordDocument doc)
{
if(!deactivateevents)
{
deactivateevents=true;
object dummy = null;
docClose(ref dummy,ref dummy,ref dummy);
deactivateevents=false;
}
}
/// <summary>
/// catches Word's quit event
/// normally it should not fire, but just to be shure
/// safely release the internal Word Instance
/// </summary>
private void OnQuit()
{
//wd=null;
}
以上就是关于c#的winform窗体中如何嵌套exe应用程序全部的内容,包括:c#的winform窗体中如何嵌套exe应用程序、VB如何吧多个EXE文件整合并实现本机调用!、c# 嵌入一个外部程序 如何让这个外部程序窗口最大化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)