C# After using OpenFileDialog, a MessageBox doesn't open on top - c#

Our primary database application has a feature that exports either an Excel workbook or an Access mdb for specified work orders. Those files are then sent to our subcontractors to populate with the required data. I am building an application that connects to the files and displays the data for review prior to being imported into the primary database. Simple enough, right? Here’s my problem: the application opens a OpenFileDialog box for the user to select the file that will be the datasource for the session. That works perfectly. If I open a MessageBox after it, that box open up behind any other open windows. After that, they respond correctly. I only expect to be using MessageBoxes for error handling, but the problem is perplexing. Has anyone encountered this problem?
The MessageBoxes in the code are only to verify that the path is correct and to solve this problem; but, here’s my code:
private void SubContractedData_Load(object sender, EventArgs e)
{
string FilePath;
string ext;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Microsoft Access Databases |*.mdb|Excel Workbooks|*.xls";
ofd.Title = "Select the data source";
ofd.InitialDirectory = ElementConfig.TransferOutPath();
if (ofd.ShowDialog() == DialogResult.OK)
{
FilePath = ofd.FileName.ToString();
ext = FilePath.Substring((FilePath.Length - 3));
if (ext == "xls")
{
MessageBox.Show(FilePath);
AccessImport(FilePath);
}
else if (ext == "mdb")
{
MessageBox.Show(FilePath);
AccessImport(FilePath);
}
}
else
{
System.Windows.Forms.Application.Exit();
}
}

While it isn't advisable to use MessageBoxes to debug your code, I think the immediate problem is that you are doing this in the form's load event.
Try it like this:
protected override void OnShown(EventArgs e) {
base.OnShown(e);
// your code
}

Your problem is definitely the fact that you're trying to do this while loading the Form, because the form isn't yet displayed.
Another alternative would be moving this functionality out of the Load event and give the user a button to push or something like that.
In other words:
private void SubContractedData_Load(object sender, EventArgs e)
{
// unless you're doing something else, you could remove this method
}
Add a button that handles this functionality:
private void SelectDataSourceClick(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Microsoft Access Databases |*.*|Excel Workbooks|*.xls";
ofd.Title = "Select the data source";
ofd.InitialDirectory = ElementConfig.TransferOutPath();
if (ofd.ShowDialog() == DialogResult.OK)
{
var FilePath = ofd.FileName.ToString();
var ext = Path.GetExtension(FilePath).ToLower();
switch (ext)
{
case ".xls":
MessageBox.Show(FilePath);
AccessImport(FilePath);
break;
case ".mdb":
MessageBox.Show(FilePath);
AccessImport(FilePath);
break;
default:
MessageBox.Show("Extension not recognized " + ext);
break;
}
}
else
{
System.Windows.Forms.Application.Exit();
}
}

Related

C# OpenFileDialog importing variable

Still new to C#, snipping some code around to write a simple application and learning while doing.
I have an xml file that needs to be ingested and set as a variable so I can have it just insert words from that text file into different text fields.
private void button1_Click(object sender, EventArgs e)
{
// Displays an OpenFileDialog so the user can select a datafeed.
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Datafeed File|*.dfx5";
openFileDialog1.Title = "Select a dfx5";
// Show the Dialog.
// If the user clicked OK in the dialog and
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// Assign the file as a variable.
}
}
How would I make that file a variable so that I can read from it?
Thank you in advanced. Google-ing didn't return anything helpful
How would I make that file a variable so that I can read from it?
Well, the file name that was selected is a property of the OpenFileDialog object:
string fileName;
// Show the Dialog.
// If the user clicked OK in the dialog and
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// Assign the file as a variable.
fileName = openFileDialog1.FileName;
}
What you do with that file name at that point is up to you.
If you want to store the Filename in a variable, the other answers are what you are looking for.
To me it sounds like you need to actually read the content of the file.
If that's what you want, the following snippet (provided by Microsoft) should do:
try
{ // Open the text file using a stream reader.
using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
{
// Read the stream to a string, and write the string to the console.
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
This way line will contain the XML data you need. How you proceed from there is up to you.
If the file is pure XML, then I'd be inclined to do something like this:
using System.Xml.Linq;
private XDocument _xmlPayload;
private void button1_Click(object sender, EventArgs e)
{
// Displays an OpenFileDialog so the user can select a datafeed.
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Datafeed File|*.dfx5";
openFileDialog1.Title = "Select a dfx5";
// Show the Dialog.
// If the user clicked OK in the dialog and
var dialogResult = openFileDialog1.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK)
{
//Get file path from dialog
var filePath = openFileDialog1.FileName;
//load xml
using(var stream = File.OpenRead(filePath))
{
_xmlPayload = XDocument.Load(stream);
}
}
}
Then it's up to you how you work with the XML.
openFileDialog1.FileName should have the returned filename from the dialog. if multiselect is enabled I think its openFileDialog1.FileNames

OpenFileDialog and UnauthorizedAccessException

I'm developing a tool that processes an .fbx model and user input into a single file for use in a game. The code for when the user presses the "Import Model" button is as follows, and is similar for every button:
private void E_ImportModelButton_Click_1(object sender, EventArgs e)
{
E_model = null; // byte array where model is stored
E_SelectedFileLabel.Text = "No Model Selected"; // label on form
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "FBX Model (.fbx)|*.fbx";
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
// adjusts variables for game file
string s = Path.GetDirectoryName(ofd.FileName);
E_model = File.ReadAllBytes(s);
E_SelectedFileLabel.Text = "File Selected: " + ofd.FileName;
}
}
The problem is, whenever I click OK, an UnauthorizedAccessException occurs. I have tried importing files from C:\Users\Owner\Downloads as well as C:\Users\Owner\Desktop and the C:\ drive itself, but it still occurs. What could I add to this code to gain access to these (and other) folders?
You are trying to read from directory via the method intended to read from a file:
string s = Path.GetDirectoryName(ofd.FileName);
E_model = File.ReadAllBytes(s);
Replace it with:
E_model = File.ReadAllBytes(ofd.FileName);
You can't ready the directory, you have to read a file:
string s = Path.GetDirectoryName(ofd.FileName);
E_model = File.ReadAllBytes(s);
Try adding the file name here

Prevent user from browsing elsewhere in an OpenFileDialog

What I need to do is prevent users from browsing anywhere else then where I declare them to browse.
for example I have: ofd.InitialDirectory = Location; on button click.
Location for example being C:\Users\Chris\Pictures.
The thing is that I know that some users will try be clever and might go selecting things outside that folder I declare. Is there any way to prevent that from happening?
Possible workaround:
Just an if statement checking if the location of the selected file starts with the same Location I start them off in.
OpenFileDialog ofd = new OpenFileDialog();
private void button1_Click(object sender, EventArgs e)
{
string newPath = #"C:\Users\Chris\Pictures";
ofd.InitialDirectory = Location;
if (ofd.ShowDialog() == DialogResult.OK)
{
if (ofd.FileName.Contains(Location))
{
textBox1.Text = ofd.FileName;
}
else
{
MessageBox.Show("Please select a file that is located in the specified location (" + Location + ")"
, "Alert", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
You can't prevent users from navigating to another folder, you have to build an own OpenFileDialog if you want to do that. You can prevent though that the file isn't accepted.
You have to handle the FileOk event for that. You can check if the parent directory is the one you want it to be.
Something like this:
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
string[] files = openFileDialog1.FileNames;
foreach (string file in files )
{
if (Path.GetDirectoryName(file) != yourRequiredPath)
{
e.Cancel = true;
break;
}
}
}
This is not possible.
You can't restrict users to prevent them to browse elsewhere where you don't wish to.
One possible way to fix this is to write your custom open dialog box with custom validations.
If you really want to prevent navigation in the file dialog the only way to do it would be to use the Common Item Dialog, provided by COM1, and give it an IFileDialogEvents and implement the OnFolderChanging event. To allow navigation, return S_OK and to deny navigation return something else.
1 "Provided by COM" as in the component object model, not some third party.

Executing another Application with selected file using a button (C# Programming)

To start, I'm a newbie with C# Programming and I've tried googling for solutions about my problem but it seems that i cannot find one, or simply too unlucky or too blind to spot one. I'm using Microsoft Visual Studio 2005.
Anyways. I was assigned to modify/create an automated test environment input application. The said application already has a function to run/start a CANoe program with a pre-defined file or if it's already running, stop the program.
private void button1_Click(object sender, EventArgs e)
{
// Execute CANoe(Obtain CANoe application objectg)
mApp = new CANoe.Application();
mMsr = (CANoe.Measurement)mApp.Measurement;
try
{
mApp.Open("C:\\Users\\uidr3024\\Downloads\\SRLCam4T0_Validation_ControlTool\\cfg\\SVT_SRLCam4T0_025B.cfg", true, true);
}
catch (System.Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
private void button2_Click(object sender, EventArgs e)
{
// Finish CANoe
if (mApp != null) {
mApp.Quit();
}
// Release the object
fnReleaseComObject(mMsr);
fnReleaseComObject(mApp);
}
What I wanted to do now is to have an OpenFileDialog box that will show a selection of files and user will be able to browse and select any file to start the CANoe program with the selected file and not just the file path that's been input in the code along the "mApp.Open()" syntax. I've tried this:
private void button5_Click_1(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = #"C:\Users\uidr3024\Downloads\SRLCam4T0_Validation_ControlTool\cfg";
openFileDialog1.Title = "Browse Configuration Files";
openFileDialog1.CheckFileExists = true;
openFileDialog1.CheckPathExists = true;
openFileDialog1.Filter = "CANalyzer/CANoe Configuration (*.cfg)|*.cfg |All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName;
}
}
I've tried this code that I often see in the Web and in the Tutorials but I don't know how to incorporate it with the button for running the CANoe program so that when user clicks the Open button from the Dialog Box, the file path would be shown in the textbox(optional) and/or when the user then clicks the Start CANoe, CANoe program would start with the selected .cfg file.
Am I making any sense here? Or am I doing the right thing here?
Btw, I found these... And I'm using a CANoe library for these, ofc.
#region "***** CANoe Object definition *****"
private CANoe.Application mApp = null; // CANoe Application CANoeƒAƒvƒŠƒP[ƒVƒ‡ƒ“
private CANoe.Measurement mMsr = null; // CANoe Mesurement function CANoe‘ª’è‹#”\
private CANoe.Variable mSysVar = null; // System variable ƒVƒXƒeƒ€•Ï”
private CANoe.Variable mSysVar_start = null; // System variable ƒVƒXƒeƒ€•Ï”
#endregion
I think you have done most of the hard work, unless I've missed something I think you just need something like this in your button1_Click method:
if( textBox1.Text != String.Empty && System.IO.File.Exists(textBox1.Text) )
{
// The textbox has a filename in it, use it
mApp.Open(textBox1.Text, true, true);
}
else
{
// The user hasn't selected a config file, launch with default
mApp.Open("C:\\Users\\uidr3024\\Downloads\\SRLCam4T0_Validation_ControlTool\\cfg\\SVT_SRLCam4T0_025B.cfg", true, true);
}

Allow users to select and change icons in a multi company program

I am developing a C# program that will allow the users to enter multiple companies, and I am trying to allow the users to use an icon (as well as the name of the company in the taskbar) for each company to help them differ easily between them.
So far I have the following code, which shows a picturebox of the icon to confirm it is the correct image, but when I run the program it crashes with an out-of-memory-exception after changing the image 3 or 4 times. After reading solutions to similar questions on this site I have tried to dispose the image but can't seem to get it to work correctly:
private void btnBrowse_Click(object sender, EventArgs e)
{
openFileDialog1.InitialDirectory = "R:\\rightsort fulfilment\\charity icons";
openFileDialog1.Title = "Choose an Icon";
openFileDialog1.FileName = "";
openFileDialog1.Filter = "Icon Files|*.ico";
if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
{
txtIcon.Text = openFileDialog1.FileName;
pictureBox1.Image = Image.FromFile(txtIcon.Text);
pictureBox1.Visible = true;
}
else
{
txtIcon.Text = "";
pictureBox1.Visible = false;
}
}
Any help would be greatly appreciated!
Image class inherited from IDisposable. You need to call Dispose method every time you replace it with new image to release resources.
However I don't know if this is the source of your problem. You also can try to run memory profiler and see where and how exactly memory gets allocated.
I would try disposing the old image in the picture control. Something like this:
if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
{
txtIcon.Text = openFileDialog1.FileName;
Image oldImage = pictureBox1.Image;
pictureBox1.Image = Image.FromFile(txtIcon.Text);
if (oldImage != null)
{
oldImage.Dispose();
}
pictureBox1.Visible = true;
}

Categories