Nasıl kodlamak ve Visual C# içinde InfoPath 2003'ü kullanarak bir dosya eki programlama kod çözme

Makale çevirileri Makale çevirileri
Makale numarası: 892730 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft Office InfoPath 2007 veya Microsoft Office InfoPath 2003 Service Pack 1 (SP1) kullanan bir Dosya eki InfoPath form şablonuna dosya eklemek için denetim. Belirli durumlarda, kodlama ve bağlı olduğu dosya kodunu çözmek isteyebilirsiniz Dosya eki Denetim. Bu durumda, Microsoft Visual C# oluşturmak için kullanabileceğiniz bir Kodlayıcı sınıf ve bir Kod çözücü sınıf. Daha sonra kullanmak Kodlayıcı sınıf ve Kod çözücü kodlama ve kod çözme dosya sınıfı Eki.

GİRİŞ

Bu makalede nasıl kodlamak ve dosya eki Microsoft Visual C# içinde InfoPath 2003'ü kullanarak programlı olarak kod çözme tanıtır. InfoPath 2010 veya InfoPath 2007 Bunun nasıl yapılacağı hakkında daha fazla bilgi için aşağıdaki web sayfasına bakın: Nasıl kodlamak ve Visual C# InfoPath 2010 veya InfoPath 2007 kullanarak bir dosya eki programlama kod çözme.

Daha fazla bilgi

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar, veya zımni garanti olmaksızın. Bu içerir, ancak bunlarla sınırlı değildir satılabilirlik veya belirli bir uygunluk zımni garantileri için Amaç. Bu makalede, ile programlama hakkında bilgi sahibi olduğunuz varsayılmaktadır. gösterilen dil ve oluşturmak için kullanılan araçlar ve yordamlar hata ayıklamak için. Microsoft destek mühendisleri açıklanmasına yardımcı olabilir Belirli bir yordamın işlevselliğinin ancak bunlar değiştirmez örnekler, ek işlevsellik sağlamak veya yordamlar karşılayacak şekilde geliştirmek için belirli gereksinimleri.

Visual C# InfoPath 2003 projesi oluşturma

  1. Microsoft Visual Studio'yu başlatın.NET 2003.
  2. Üzerinde Dosya menüsünü tıklatınYenive ardından Proje.
  3. İçinde Yeni proje iletişim kutusunu tıklatınVisual C# Projects Microsoft Office InfoPath projeleri klasör.
  4. İçinde Adı kutusunaAttachmentEncodingve ardındanTAMAM.
  5. Microsoft Office Project Sihirbazı'nı tıklatın.Yeni bir form şablonu oluşturmave ardındanSon.

    Microsoft Office Project sihirbazın oluşturduğu bir Yeni Visual Studio.AttachmentEncoding adlı net 2003 proje. Bir InfoPath form şablonu da oluşturulur. InfoPath form şablonu AttachmentEncoding adlı.

Visual Studio'da kodlayıcı sınıf oluşturun.NET 2003

  1. Solution Explorer'da sağ tıklatın.AttachmentEncoding, işaret Eklemeve ardından ' ı tıklatın Yeni Öğe Ekle.
  2. İçinde Yeni Öğe Ekle iletişim kutusunu tıklatınSınıf içinde Şablon bölmesinde türüInfoPathAttachmentEncoder.cs içindeAdı kutusunu tıklatın ve sonra Açık.
  3. InfoPathAttachmentEncoder.cs tüm kodu Değiştir Aşağıdaki kod dosyası.
    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// InfoPathAttachment encodes file data into the format expected by InfoPath for use in file attachment nodes.
    	/// </summary>
    	public class InfoPathAttachmentEncoder
    	{
    		private string base64EncodedFile = string.Empty;
    		private string fullyQualifiedFileName;
    
    		/// <summary>
    		/// Creates an encoder to create an InfoPath attachment string.
    		/// </summary>
    		/// <param name="fullyQualifiedFileName"></param>
    		public InfoPathAttachmentEncoder(string fullyQualifiedFileName)
    		{
    			if (fullyQualifiedFileName == string.Empty)
    				throw new ArgumentException("Must specify file name", "fullyQualifiedFileName");
    
    			if (!File.Exists(fullyQualifiedFileName))
    				throw new FileNotFoundException("File does not exist: " + fullyQualifiedFileName, fullyQualifiedFileName);
    
    			this.fullyQualifiedFileName = fullyQualifiedFileName;
    		}
    
    		/// <summary>
    		/// Returns a Base64 encoded string.
    		/// </summary>
    		/// <returns>String</returns>
    		public string ToBase64String()
    		{
    			if (base64EncodedFile != string.Empty)
    				return base64EncodedFile;
    
    			// This memory stream will hold the InfoPath file attachment buffer before Base64 encoding.
    			MemoryStream ms = new MemoryStream();
    
    			// Get the file information.
    			using (BinaryReader br = new BinaryReader(File.Open(fullyQualifiedFileName, FileMode.Open, FileAccess.Read, FileShare.Read)))
    			{
    				string fileName = Path.GetFileName(fullyQualifiedFileName);
    
    				uint fileNameLength = (uint)fileName.Length + 1;
    
    				byte[] fileNameBytes = Encoding.Unicode.GetBytes(fileName);
    
    				using (BinaryWriter bw = new BinaryWriter(ms))
    				{
    					// Write the InfoPath attachment signature. 
    					bw.Write(new byte[] { 0xC7, 0x49, 0x46, 0x41 });
    
    					// Write the default header information.
    					bw.Write((uint)0x14);	// size
    					bw.Write((uint)0x01);	// version
    					bw.Write((uint)0x00);	// reserved
    
    					// Write the file size.
    					bw.Write((uint)br.BaseStream.Length);
    
    					// Write the size of the file name.
    					bw.Write((uint)fileNameLength);
    
    					// Write the file name (Unicode encoded).
    					bw.Write(fileNameBytes);
    
    					// Write the file name terminator. This is two nulls in Unicode.
    					bw.Write(new byte[] {0,0});
    
    					// Iterate through the file reading data and writing it to the outbuffer.
    					byte[] data = new byte[64*1024];
    					int bytesRead = 1;
    
    					while (bytesRead > 0)
    					{
    						bytesRead = br.Read(data, 0, data.Length);
    						bw.Write(data, 0, bytesRead);
    					}
    				}
    			}
    
    
    			// This memorystream will hold the Base64 encoded InfoPath attachment.
    			MemoryStream msOut = new MemoryStream();
    
    			using (BinaryReader br = new BinaryReader(new MemoryStream(ms.ToArray())))
    			{
    				// Create a Base64 transform to do the encoding.
    				ToBase64Transform tf = new ToBase64Transform();
    
    				byte[] data = new byte[tf.InputBlockSize];
    				byte[] outData = new byte[tf.OutputBlockSize];
    
    				int bytesRead = 1;
    
    				while (bytesRead > 0)
    				{
    					bytesRead = br.Read(data, 0, data.Length);
    
    					if (bytesRead == data.Length)
    						tf.TransformBlock(data, 0, bytesRead, outData, 0);
    					else
    						outData = tf.TransformFinalBlock(data, 0, bytesRead);
    
    					msOut.Write(outData, 0, outData.Length);
    				}
    			}
    
    			msOut.Close();
    			
    			return base64EncodedFile = Encoding.ASCII.GetString(msOut.ToArray());
    		}
    	}
    }

Visual Studio kod çözücü sınıf oluşturun.NET 2003

  1. Solution Explorer'da sağ tıklatın.AttachmentEncoding, işaret Eklemeve ardından ' ı tıklatın Yeni Öğe Ekle.
  2. İçinde Yeni Öğe Ekle iletişim kutusunu tıklatınSınıf içinde Şablon bölmesinde türüInfoPathAttachmentDecoder.cs içindeAdı kutusunu tıklatın ve sonra Açık.
  3. InfoPathAttachmentDecoder.cs tüm kodu Değiştir Aşağıdaki kod dosyası.
    using System;
    using System.IO;
    using System.Text;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// Decodes a file attachment and saves it to a specified path.
    	/// </summary>
    	public class InfoPathAttachmentDecoder
    	{
    		private const int SP1Header_Size = 20;
    		private const int FIXED_HEADER = 16;
    
    		private int fileSize;
    		private int attachmentNameLength;
    		private string attachmentName;
    		private byte[] decodedAttachment;
    
    		/// <summary>
    		/// Accepts the Base64 encoded string
    		/// that is the attachment.
    		/// </summary>
    		public InfoPathAttachmentDecoder(string theBase64EncodedString)
    		{
    			byte [] theData = Convert.FromBase64String(theBase64EncodedString);
    			using(MemoryStream ms = new MemoryStream(theData))
    			{
    				BinaryReader theReader = new BinaryReader(ms);			
    				DecodeAttachment(theReader);
    			}
    		}
    
    		private void DecodeAttachment(BinaryReader theReader)
    		{
    			//Position the reader to get the file size.
    			byte[] headerData = new byte[FIXED_HEADER];
    			headerData = theReader.ReadBytes(headerData.Length);
    
    			fileSize = (int)theReader.ReadUInt32();
    			attachmentNameLength = (int)theReader.ReadUInt32() * 2;
    			
    			byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
    			//InfoPath uses UTF8 encoding.
    			Encoding enc = Encoding.Unicode;
    			attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
    			decodedAttachment = theReader.ReadBytes(fileSize);
    		}
    
    		public void SaveAttachment(string saveLocation)
    		{
    			string fullFileName = saveLocation;
    			if(!fullFileName.EndsWith(Path.DirectorySeparatorChar))
    			{
    				fullFileName += Path.DirectorySeparatorChar;
    			}
    
    			fullFileName += attachmentName;
    
    			if(File.Exists(fullFileName))
    				File.Delete(fullFileName);
    			
    			FileStream fs = new FileStream(fullFileName, FileMode.CreateNew);
    			BinaryWriter bw = new BinaryWriter(fs);
    			bw.Write(decodedAttachment);
    
    			bw.Close();
    			fs.Close();
    		}
    
    		public string Filename
    		{
    			get{ return attachmentName; }
    		}
    
    		public byte[] DecodedAttachment
    		{
    			get{ return decodedAttachment; }
    		}
    	}	
    }
    
    

InfoPath formu bir dosya eki ve metin kutusu denetimi ekleme

  1. AttachmentEncoding InfoPath form şablonu ' ı tıklatın Denetimleri içinde Tasarım Görevleri Görev bölme.
  2. İçinde Denetimleriı görev bölmesiDosya Eki altındaDenetimleri Ekle.
  3. Sağ tıklatın Dosya eki Denetim, ' ı Dosya eki özellikleri.
  4. İçinde Dosya eki özellikleri iletişim kutusuna theAttachmentField içinde Alan Adı kutusunu tıklatın ve sonra TAMAM.
  5. İçinde Denetimleriı görev bölmesiMetin kutusu altındaDenetimleri Ekle.
  6. Sağ tıklatın Metin kutusu Denetim ve ' ı tıklatın Metin kutusu özellikleri.
  7. İçinde Metin kutusu özellikleri iletişim kutusu türü theAttachmentName içinde Alan Adı kutusunu tıklatın ve sonra TAMAM.

InfoPath formu Ekle düğmesi ekleme

  1. İçinde Denetimleriı görev bölmesiDüğme altındaDenetimleri Ekle.
  2. Yeni sağ tıklatın Düğme Denetim ve i Düğme özellikleri.
  3. İçinde Düğme özellikleri iletişim kutusu türüEkle içinde Etiket kutusunabtnAttach içinde KİMLİĞİ kutusunu tıklatın ve sonraForm kodu Düzenle.
  4. İçine aşağıdaki kodu ekleyin btnAttach_OnClick yöntem.
    //Get a reference to the attachment node.
    IXMLDOMNode theAttachmentNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    
    //Get a reference to the filename node.
    IXMLDOMNode fileNameNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentName");
    //Get the text of the node.
    String fileName = fileNameNode.text;
    if(fileName.Length > 0)
    {
    	//Encode the file and assign it to the attachment node.
    	InfoPathAttachmentEncoding.Encoder myEncoder = new InfoPathAttachmentEncoding.Encoder(fileName);
    	if(theAttachmentNode.attributes.getNamedItem("xsi:nil") != null)
    		theAttachmentNode.attributes.removeNamedItem("xsi:nil");
    	theAttachmentNode.text = myEncoder.ToBase64String();
    }	
    

InfoPath formu Kaydet düğmesini ekleme

  1. AttachmentEncoding InfoPath form geçiş Şablon.
  2. İçinde Denetimleriı görev bölmesiDüğme altındaDenetimleri Ekle.
  3. Yeni sağ tıklatın Düğme Denetim ve i Düğme özellikleri.
  4. İçinde Düğme özellikleri iletişim kutusu türüKaydet içinde Etiket kutusunabtnSave içinde KİMLİĞİ kutusunu tıklatın ve sonraForm kodu Düzenle.
  5. İçine aşağıdaki kodu ekleyin btnSave _OnClick yöntem.
    //Get a reference to the attachment node.
    IXMLDOMNode n = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    //Get the text of the node.
    String theAttachment = n.text;
    if(theAttachment.Length > 0)
    {
    	InfoPathAttachmentEncoding.Decoder myDecoder = new InfoPathAttachmentEncoding.Decoder(theAttachment);
    	myDecoder.SaveAttachment(@"<Path to save the file>");
    }			
    
    Not Bu kodu, değiştirme <Path to="" save="" the="" file=""></Path> kaydetmek istediğiniz konumu ile dosya.

InfoPath form şablonu tam güvenilir olduğundan emin olun

Bu form InfoPath form şablonu önce sınama tam güvenilmesi gerekir. Emin olmak için aşağıdaki yöntemlerden birini kullanabilirsiniz InfoPath form şablonu tam, güvenilir:
  • Microsoft kullanın.net Framework 1.1 Yapılandırması yardımcı programı Tam güven izinleri yalnızca Visual C# kodu atamak için.
  • InfoPath Software RegForm yardımcı programını kullanın Development Kit (tam güvenilir form formu oluşturmak için sdk). Bu tam verir Visual C# kodu izinlerine güvenir.
  • Formu dijital olarak imzalamak için kod imzalama sertifikası kullanın. Şablon dosyası (.xsn). Kod imzalama sertifikasıyla dijital olarak imzalamak için kullanacağınız zaman form şablonu dosyası kullanıcılar formu açtıklarında güven istenir Form. Bu, tam güvenilir form sağlar. Bu nedenle, tam güven izinleri olan Bilgisayarınızda Visual C# kodu verilir.
  • Kullan IPFullTrust Makro formu tam güvenilir hale getirmek için InfoPath SDK Form. , IPFullTrust Makro bildirim dosyasındaki (.xsf) ve form otomatikleştirir. InfoPath proje şablonu dosyası için tam güven ve IPFullTrust Makro, form şablonu otomatik olarak kaydeder.

    İçin Yükleme ve makro kullanma hakkında daha fazla bilgi için şu Microsoft Developer Network (msdn) Web sitesi:
    http://msdn2.microsoft.com/en-us/library/aa202736 (office.11) .aspx
  • Dış Otomasyon InfoPath'de çağırmak için kullanın. RegisterSolution yöntem. Genellikle, form geliştirme için bu yöntemi yalnızca kullanılır çünkü kayıtlı form yalnızca tek bir bilgisayar için kaydeder. İçin Ek formlar, diğer kullanıcıların ek formları kendi kaydetmeniz gerekir bilgisayarlar. Ek formları için bu yöntem önerilmez. Öneririz form yayımladığınızda, yukarıdaki yöntemlerden herhangi biri.
Bu formu, form geliştirme aşamasında olduğundan kullanabilirsiniz Son yöntem. Bunu yapmak için AttachmentEncoding InfoPath formu bulun. Şablon ve sonra aşağıdaki adımları izleyin:
  1. Üzerinde Araçlar menüsünü tıklatın Form Seçenekleri.
  2. ' I tıklatın Güvenlik sekmesini tıklatın.
  3. Temizlemek için tıklatın Güvenlik otomatik olarak belirleme (önerilen) formun tasarımına dayanan düzeyi onay kutusunu seçin.

    Not InfoPath otomatik olarak iş mantığı algılayamıyor, Tam güven izinleri gerektirir. Bu nedenle, açıkça tam vermeniz gerekir İzinleri güven.
  4. ' I tıklatın Tam güvenve ardındanTAMAM.
  5. AttachmentEncoding InfoPath form şablonunu kapatın. Değişiklikleri kaydetmek için istenirse tıklatın. Evet.

    Not Visual Studio kapatmayın.net 2003 proje.
  6. Visual Studio.net 2003, çift tıklatınManifest.xsf Solution Explorer'da dosya. Manifest.xsf dosyasını açılır.
  7. Kök düğümü bulun. publishUrl öznitelik. Kaldır publishUrl özniteliği ve değeri publishUrl öznitelik.
  8. Değişikliklerinizi kaydetmek ve Manifest.xsf kapatın dosya.
  9. ' I tıklatın Başlat,'ı tıklatın Çalıştır, türü Not Defterive ardındanTAMAM.
  10. Boş bir metin dosyasına aşağıdaki kodu ekleyin.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Not Bu kodu, değiştirme<project_folder_url></project_folder_url> yolu ile Proje klasöründeki manifest.xsf dosyasını. Kaçış yolu unutmayın. Manifest.xsf dosyasını. Tüm bölü (\) yolu ile değiştirilmesi gereken iki ters eğik çizgi (\).
  11. Bilgisayarda Manifest.xsf dosyasını Kaydet Register.js dosyası.
  12. Aranacak RegisterSolution yöntem, çift tıklatın Register.js Dosya oluşturduğunuz.

Formunu s?nay?n

  1. AttachmentEncoding Visual Studio.net 2003 proje ' ı tıklatın Başlat üzerinde Hata ayıklama menü. Bu başlatır InfoPath form önizleme modunda.
  2. InfoPath formda dosyasının yolunu yazın, metin kutusu ekleyin ve istediğinizEkle.

    Not Çift tıklatın Dosya eki için kontrol Dosya doğru biçimde kodlanmış doğrulayın.
  3. ' I tıklatın Kaydet. Yolu bulun, sizin sağlanan "Ekle bir Kaydet InfoPath formu düğmeye" bölümüne geçebilirsiniz.
  4. Sınamayı bitirmek için tıklatın Kapat Önizleme.

Referanslar

Dosya eki başlığı hakkında daha fazla bilgi için biçimlendirmek için aşağıdaki msdn Web sitesini ziyaret edin:
InfoPath 2003'te dosya ekleme
http://msdn2.microsoft.com/en-us/library/aa168351 (office.11) .aspx

Özellikler

Makale numarası: 892730 - Last Review: 5 Mart 2012 Pazartesi - Gözden geçirme: 0.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Office InfoPath 2003
Anahtar Kelimeler: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:892730

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com