|
Hi,
I'm going to use HTML5 in C# windows form application.
But WebBrowser tool in my toolbox does not support HTML5.
So, I want to use chrome browser in my C# application.
Please help.
|
|
|
|
|
There's a library available called "Chromium"; you'll need the SDK and the C# bindings.
Google knows where to find them.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thank you for you answer.
I download cef_binary_3.2171.1979_windows32, but it doesn't supply WebRTC.
|
|
|
|
|
Ok so I saw the cast on "altChunk" (https://www.youtube.com/watch?v=couuEc6eEjE) and the blog (http://blogs.msdn.com/b/ericwhite/archive/2008/10/27/how-to-use-altchunk-for-document-assembly.aspx), especially the HTML section. I am very new to XML and it's tools and I have been struggling to put all the pieces together. 85% of code is from research and altered.
OBJECTIVE: I have a PowerPoint slide template that has a couple of text fields that I fill (id [uic], name, PreviousDate, CurrentDate, ...) then it has two embedded word objects representing Previous Notes and Current Notes respectively. These two embedded Word objects are what I am trying to put HTML in. The HTML comes from user input via the web and stores it in a DB field. So I am looping through my data rows-->creating a copy of the slide template-->filling the placeholders (id [uic], name, PreviousDate, CurrentDate) with the data from a row-->then I am trying to fill each embedded Word object with it's HTML data-->save the slide and start the process over for each row of data.
Here is what I have so far. I have gone down many rabbit trails but I have tried to clean the code up to show just current code. My current issue is that when the slide saves it disposes my object/connection/stream(?) so I can not fill the second object. Do I need to not save until I fill both Word objects? I see the "altChunkID" but I can not tell if it actually references anything. Do I need to declare an XNamespace for the altChunk relationship?
I think I am close, but I just missing a few pieces that tie it all together. Any assistance would be educational and greatly appreciated. Below is my code; starting with a call to renderPPT(). ...Thank you in advance. :
using System;
using System.Globalization;
using System.Data;
using System.Data.Odbc;
using System.Drawing;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.Security.Principal;
using System.Text;
using System.Data.SqlClient;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Drawing;
using System.Xml;
using System.Xml.Linq;
namespace NotesFor.HtmlToOpenXml
{
public partial class Data2PPT : System.Web.UI.Page
{
static int index = 1;
XDocument mainDocX = new XDocument();
public partial class Data2Powerpoint
{
public string strUIC;
public string strANAME;
public string strPrevUpdate;
public HtmlAgilityPack.HtmlDocument htmlPrevNotes;
public HtmlAgilityPack.HtmlDocument htmlCurrNotes;
public string strCurrUpdate;
public Data2Powerpoint()
{ }
}
public void renderPPT()
{
if (File.Exists(Server.MapPath("PowerPointTemplate/FAMBriefingNotes.pptx")))
{ File.Delete(Server.MapPath("PowerPointTemplate/FAMBriefingNotes.pptx")); }
File.Copy(Server.MapPath("PowerPointTemplate/EmbedWordPPT.pptx"), Server.MapPath("PowerPointTemplate/FAMBriefingNotes.pptx"), true);
using (PresentationDocument myPres = PresentationDocument.Open(Server.MapPath("PowerPointTemplate/FAMBriefingNotes.pptx"), true))
{
PresentationPart presPart = myPres.PresentationPart;
if (presPart != null && presPart.Presentation != null)
{
Presentation pres = presPart.Presentation;
if (pres.SlideIdList != null)
{
var slideIDs = pres.SlideIdList.ChildElements;
string slidePartRelationshipID = (slideIDs[0] as SlideId).RelationshipId;
SlidePart sldPart = (SlidePart)presPart.GetPartById(slidePartRelationshipID);
if (Session["dtbl2ppt"] != null)
{
DataTable dt = (DataTable)Session["dtbl2ppt"];
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
SlidePart newSldPart = CloneSlidePart(presPart, sldPart);
string HTMLheader = @"<html> <p align='left'>
<head>
<style id='oboutEditorDefaultStyle'>
.blueItalic { color: #0000ff; font-style:italic;}
body {
color:#404040;background-color: #fff;
border-width: 0px;margin-top: 0px; margin-bottom: 0px;
margin-left: 0px; margin-right: 0px;
padding-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;
}
body,table td
{
font-family: verdana,sans-serif;font-size: 10pt;
}
h1 {
font-size: 24pt;
}
h2 {
font-size: 18pt;
}
h3 {
font-size: 14pt;
}
h4 {
font-size: 12pt;
}
h5 {
font-size: 10pt;
}
h6 {
font-size: 8pt;
}
</style>
</head>
<body>";
string HTMLfooter = @"</p></body></html>";
HtmlAgilityPack.HtmlDocument htmlPrevNotesDoc = new HtmlAgilityPack.HtmlDocument();
htmlPrevNotesDoc.OptionOutputAsXml = true;
htmlPrevNotesDoc.LoadHtml(HTMLheader + dt.Rows[i]["PrevUnitNotes"].ToString() + HTMLfooter);
HtmlAgilityPack.HtmlDocument htmlCurrNotesDoc = new HtmlAgilityPack.HtmlDocument();
htmlCurrNotesDoc.OptionOutputAsXml = true;
htmlCurrNotesDoc.LoadHtml(HTMLheader + dt.Rows[i]["CurrUnitNotes"].ToString() + HTMLfooter);
String strPrevDT = ""; String strCurrDT = "";
if (dt.Rows[i]["PrevUpdate"] != null && dt.Rows[i]["PrevUpdate"].ToString().Length > 0)
{ strPrevDT=DateTime.Parse(dt.Rows[i]["PrevUpdate"].ToString()).ToString("yyyy-MMM-dd HH:MM"); }
if (dt.Rows[i]["CurrUpdate"] != null && dt.Rows[i]["CurrUpdate"].ToString().Length > 0)
{ strCurrDT = DateTime.Parse(dt.Rows[i]["CurrUpdate"].ToString()).ToString("yyyy-MMM-dd HH:MM"); }
SwapPlaceholderText(myPres, newSldPart, "UIC", dt.Rows[i]["UIC"].ToString(), false, i);
SwapPlaceholderText(myPres, newSldPart, "ANAME", dt.Rows[i]["ANAME"].ToString(), false, i);
SwapPlaceholderText(myPres, newSldPart, "PrevUpdate", strPrevDT, false, i);
SwapPlaceholderText(myPres, newSldPart, "CurrUpdate", strCurrDT, false, i);
SwapPlaceholderText(myPres, newSldPart, "PrevUnitNotes", htmlPrevNotesDoc.DocumentNode.InnerHtml, true, i);
SwapPlaceholderText(myPres, newSldPart, "CurrUnitNotes", htmlCurrNotesDoc.DocumentNode.InnerHtml, true, i + 1);
List<DocumentFormat.OpenXml.Drawing.Text> begTagList = newSldPart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>()
.Where(t => t.Text.Contains("<#")).ToList();
foreach (DocumentFormat.OpenXml.Drawing.Text text in begTagList)
text.Text = "";
List<DocumentFormat.OpenXml.Drawing.Text> endTagList = newSldPart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>()
.Where(t => t.Text.Contains("#>")).ToList();
foreach (DocumentFormat.OpenXml.Drawing.Text text in endTagList)
text.Text = "";
}
DeleteTemplateSlide(presPart, sldPart, slidePartRelationshipID);
}
}
}
else
{
Response.Write("No rows found.");
}
}
}
}
static void SwapPlaceholderText(PresentationDocument pDoc, SlidePart slidePart, string placeholder, string value, bool outputXML, int cnt)
{
if (!outputXML)
{
List<DocumentFormat.OpenXml.Drawing.Text> textList = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>()
.Where(t => t.Text.Contains(placeholder)).ToList();
foreach (DocumentFormat.OpenXml.Drawing.Text text in textList)
text.Text = value;
}
else if (placeholder == "PrevUnitNotes" || placeholder == "CurrUnitNotes")
{
using (pDoc)
{
Slide sld = slidePart.Slide;
var oleObject = sld.Descendants<OleObject>().FirstOrDefault();
if (oleObject != null)
{
var pp = pDoc.PresentationPart;
var sld1 = pp.Presentation.SlideIdList.ChildElements.OfType<SlideId>().FirstOrDefault();
var rid = sld1.RelationshipId.Value;
var sldPt = (SlidePart)pp.GetPartById(rid);
var oleRid = oleObject.Id.Value;
var embeddedPackagePart = (EmbeddedPackagePart)sldPt.GetPartById(oleRid);
XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
XNamespace r = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
using(var stream = embeddedPackagePart.GetStream())
using (WordprocessingDocument wDoc = WordprocessingDocument.Open(stream, true))
{
var wpDocPart = wDoc.MainDocumentPart;
HtmlConverter converter = new HtmlConverter(wpDocPart);
Body bdy = wpDocPart.Document.Body;
string altChunkId = "AltChunkId" + cnt;
AlternativeFormatImportPart chunk = wpDocPart.AddAlternativeFormatImportPart("application/xhtml+xml", altChunkId);
using (Stream chunkStream = chunk.GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite))
using (StreamWriter stringStream = new StreamWriter(chunkStream))
stringStream.Write(value);
XElement altChunk = new XElement(w + "altChunk", new XAttribute(r + "id", altChunkId));
XDocument mainDocX = GetXDocument(wDoc);
mainDocX.Root
.Element(w + "body")
.Elements(w + "p")
.Last()
.AddAfterSelf(altChunk);
SaveXDocument(wDoc, mainDocX);
}
}
}
}
}
private static void SaveXDocument(WordprocessingDocument myDoc, XDocument mainDocumentXDoc)
{
using (Stream str = myDoc.MainDocumentPart.GetStream(FileMode.Create, FileAccess.Write))
using (XmlWriter xw = XmlWriter.Create(str))
mainDocumentXDoc.Save(xw);
}
private static XDocument GetXDocument(WordprocessingDocument myDoc)
{
XDocument mainDocumentXDoc;
using (Stream str = myDoc.MainDocumentPart.GetStream())
using (XmlReader xr = XmlReader.Create(str))
mainDocumentXDoc = XDocument.Load(xr);
return mainDocumentXDoc;
}
static SlidePart CloneSlidePart(PresentationPart presentationPart, SlidePart slideTemplate)
{
SlidePart newSlidePart = presentationPart.AddNewPart<SlidePart>("newSlide" + index);
index++;
newSlidePart.FeedData(slideTemplate.GetStream(FileMode.Open));
newSlidePart.AddPart(slideTemplate.SlideLayoutPart);
SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;
uint maxSlideId = 1;
SlideId prevSlideId = null;
foreach (SlideId slideId in slideIdList.ChildElements)
{
if (slideId.Id > maxSlideId)
{
maxSlideId = slideId.Id;
prevSlideId = slideId;
}
}
maxSlideId++;
SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
newSlideId.Id = maxSlideId;
newSlideId.RelationshipId = presentationPart.GetIdOfPart(newSlidePart);
return newSlidePart;
}
static void DeleteTemplateSlide(PresentationPart presentationPart, SlidePart slideTemplate, string relId)
{
SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;
foreach (SlideId slideId in slideIdList.ChildElements)
{
if (slideId.RelationshipId.Value.Equals(relId))
slideIdList.RemoveChild(slideId);
}
presentationPart.DeletePart(slideTemplate);
}
static void CalculateImageEmus(Bitmap bitmap, out int widthInEmu, out int heightInEmu)
{
float verticalResolution = bitmap.VerticalResolution;
float horizontalResolution = bitmap.HorizontalResolution;
int width = bitmap.Size.Width;
int height = bitmap.Size.Height;
float widthInInches = (float)width / horizontalResolution;
float heightInInches = (float)height / verticalResolution;
widthInEmu = (int)(widthInInches * 914400);
heightInEmu = (int)(heightInInches * 914400);
}
}
}
|
|
|
|
|
Hi, I'm fairly new to C# and recently I started developing a speech recognition program. At the moment I have a grammar builder which reads from a text file. This means it will only recognise a command if it's in that text file. I would really like to implement Google speech in to my program so I can search google, youtube etc without adding it to a text file. I know you can do it because I've seen people do it and it works by sending a audio file and then Google sends back the closest to confidence text.
If possible I'd really like for someone to help me to implement this. My current code(the rest is just commands) http://pastebin.com/yukznbeD[^]
|
|
|
|
|
|
Yes this is something that I'm looking for but I'm not sure how I would implement this into my C# project.
|
|
|
|
|
You start by studying the documentation.
|
|
|
|
|
I've been reading various articles and topics over the past few days. But most of them are either how to implement them into a website or something else. I just found a vb.net code snippet of how to do this so I converted it into C# so I have the right code I just don't know how I would record a flac file or add it to my code.
|
|
|
|
|
|
I just downloaded this and spent some time looking at it. It looks useful although I have no idea how to implement all this. I'm thinking about hiring someone to do this for me because there is no way I'm going to be able to do this.
|
|
|
|
|
Member 11436547 wrote: there is no way I'm going to be able to do this.
Well, you will never be able to do it unless you at least try.
If you hire someone, all you will get is more code you don't understand, can't maintain, and which doesn't help you with the next version.
If you at least try, you may learn something - and sufficient learning means you ended up doing it yourself all along.
But...if you want to hire someone I suggest you go to Freelancer.com and ask there.
But be aware: you get what you pay for. Pay peanuts, get monkeys.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Yes you're right but I have no idea how to even start
|
|
|
|
|
|
Thank you! That was so motivational! You're right what's the worse that can happen
|
|
|
|
|
You're welcome!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
What OG said.
Even if you hire someone, you need to educate yourself to some level first; else you will not know if you are being taken advantage of.
|
|
|
|
|
Dear Experts,
I am trying to get the value for current cell in DatagridView. I wrote code
dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
in CellLeave event.
but the code raise an error.
Object reference not set to an instance of an object.
But if I write the code in Button_Click event, it is working properly.
Please help.
Ahmad
|
|
|
|
|
Use the debugger.
When you get the exception, use the debugger to look at the various parts of that, and work out what the values of each part are: e.ColumnIndex, e.RowIndex, and so forth.
Personally, I'd be using dataGridView1.Rows[rowindex].Cells[columnIndex] and checking the return value to make sure there is one.
I suspect you have just mixed up the row and column, and been lucky not to get an index out of range error.
But the debugger is the best way to find out.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Thank you Sir,
I have tried your code, but I get the same error.
Below is the exception message I received.
The code works under Button_Cleck event.
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=ERP
StackTrace:
at ERP.frmCalendar.dataGridView1_CellLeave(Object sender, DataGridViewCellEventArgs e) in C:\Projects\ERP\ERP\GL\frmCalendar.cs:line 103
at System.Windows.Forms.DataGridView.OnCellLeave(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnCellLeave(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex)
at System.Windows.Forms.DataGridView.CommitEdit(DataGridViewCell& dataGridViewCurrentCell, DataGridViewDataErrorContexts context, DataGridViewValidateCellInternal validateCell, Boolean fireCellLeave, Boolean fireCellEnter, Boolean fireRowLeave, Boolean fireRowEnter, Boolean fireLeave)
at System.Windows.Forms.DataGridView.EndEdit(DataGridViewDataErrorContexts context, DataGridViewValidateCellInternal validateCell, Boolean fireCellLeave, Boolean fireCellEnter, Boolean fireRowLeave, Boolean fireRowEnter, Boolean fireLeave, Boolean keepFocus, Boolean resetCurrentCell, Boolean resetAnchorCell)
at System.Windows.Forms.DataGridView.CommitEditForOperation(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.ScrollIntoView(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.TabToNextCell()
at System.Windows.Forms.DataGridView.ProcessTabKey(Keys keyData)
at System.Windows.Forms.DataGridView.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.Control.PreProcessMessage(Message& msg)
at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg)
at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at ERP.frmLogin.runAppl() in C:\Projects\ERP\ERP\frmLogin.cs:line 103
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
|
|
|
|
|
So use the debugger and find out which bit is null.
Then you can look at why!
But I can't do that for you - I have no access to your computer...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Hi,
when you get "Object reference not set to an instance of an object" exceptions some of the properties you invoke have returned null , in this case most likely Value for an empty grid cell. Check the Value for null before using it:
var gridValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
if( gridValue != null )
{
string gridStringValue = gridValue.ToString();
...
}
|
|
|
|
|
string cellval = "";
if(dataGridView1[e.ColumnIndex, e.RowIndex].Value != null){
cellval = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
}
I usually use Convert.ToString(...); in such cases, because it will convert a null to "" automatically.
(not useful in all cases)
|
|
|
|
|
I want to write a string to a memory mapped file. I have used Marshalling to achieve desired size of string. I am getting an exception when I try to write my structure which contains a string and an int. If I remove the string, The code runs successfully.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO.MemoryMappedFiles;
namespace ConsoleApplication25
{
class Program
{
static void Main(string[] args)
{
MemoryCreate<MemWriter> SharedData = new MemoryCreate<MemWriter>();
MemWriter MemWriterObj = new MemWriter();
if (!SharedData.open()) return;
MemWriterObj.f=10;
MemWriterObj.mystring = "Test";
SharedData.Writer = MemWriterObj;
Console.ReadLine();
SharedData.close();
}
}
class MemoryCreate<T> where T:struct
{
MemoryMappedFile mmf;
MemoryMappedViewAccessor accessor;
public bool open()
{
try
{
mmf = MemoryMappedFile.CreateNew("Test", 100);
accessor = mmf.CreateViewAccessor(0, 0);
return true;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}
public void close()
{
accessor.Dispose();
mmf.Dispose();
}
public T Writer
{
set
{
try
{
accessor.Write<T>(0, ref value);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
[StructLayout(LayoutKind.Sequential,Pack=1,CharSet=CharSet.Ansi)]
struct MemWriter
{
public int f;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=16)] public string mystring;
}
}
[edit]Code block added - OriginalGriff[/edit]
modified 2-May-15 7:15am.
|
|
|
|
|
|