File Browse user control function list:
- Support choose file using OpenFileDialog
- Support save pervious selected file path to INI file
- Support custom Filter
- Add event ChoosedFile fire after file choosed
- Handle event keypress on TextBox file path
Build and view on Toolbox to choose user control display
Drag to Form to use
Config some custom property and event:
Code:
namespace ReadResourceFile.UserControls { public partial class ucOpenFile : UserControl { private const string _iniFile = "/Setting.ini"; [Description("Default file path"), DefaultValue("")] public string DefaultPath { get { return txtFullPath.Text; } set { txtFullPath.Text = value; } } private string _sectionStoreFile; [DefaultValue("")] public string SectionStoreFile { get { return _sectionStoreFile; } set { _sectionStoreFile = value; } } private string _sectionStoreKey = "FilePath"; [DefaultValue("FilePath")] public string SectionStoreKey { get { return _sectionStoreKey; } set { if (string.IsNullOrWhiteSpace(value)) value = "FilePath"; _sectionStoreKey = value; } } public ucOpenFile() { InitializeComponent(); } public event EventHandler<string> ChoosedFile; public void OnChoosedFile(object sender, string arg) { if (ChoosedFile != null) ChoosedFile(sender, arg); if (!string.IsNullOrWhiteSpace(SectionStoreFile)) IniWriter.IniWrite(Environment.CurrentDirectory + _iniFile, SectionStoreFile, SectionStoreKey, arg); } private void btnBrowse_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); if (!string.IsNullOrWhiteSpace(txtFullPath.Text)) { if (File.Exists(txtFullPath.Text)) dlg.InitialDirectory = Path.GetDirectoryName(txtFullPath.Text); else if (Directory.Exists(txtFullPath.Text)) dlg.InitialDirectory = txtFullPath.Text; else dlg.InitialDirectory = Path.GetPathRoot(txtFullPath.Text); } dlg.Filter = Filter; if (dlg.ShowDialog() == DialogResult.OK) { txtFullPath.Text = dlg.FileName; OnChoosedFile(txtFullPath, dlg.FileName); } } [Description("Filter file type"), DefaultValue("")] public string Filter { get; set; } private void txtFullPath_KeyPress(object sender, KeyPressEventArgs e) { string path = txtFullPath.Text.Trim(); if (IsValidPath(path)) { string extension = Path.GetExtension(path).ToLower(); if (e.KeyChar == (char)13 && File.Exists(path) && (Array.IndexOf(ArrType, ".*") >= 0 || Array.IndexOf(ArrType, extension) >= 0)) { OnChoosedFile(txtFullPath, path); } } } private bool IsValidPath(string path) { if (path.Length < 3) return false; Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$"); if (!driveCheck.IsMatch(path.Substring(0, 3))) return false; string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars()); strTheseAreInvalidFileNameChars += @":/?*" + "\""; Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]"); if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3))) return false; return true; } public string[] ArrType { get { if (string.IsNullOrWhiteSpace(Filter)) return new string[0]; string[] arr = Filter.Split('|'); string[] output = new string[arr.Length / 2]; if (arr.Length > 1) for (int i = arr.Length - 1; i >= 0; i -= 2) { if (i % 2 != 0) output[i / 2] = arr[i].Trim().Substring(1).ToLower(); } return output; } } private void ucOpenFile_Load(object sender, EventArgs e) { if (!string.IsNullOrWhiteSpace(SectionStoreFile)) { string filePath = IniWriter.IniRead(Environment.CurrentDirectory + _iniFile, this.SectionStoreFile, SectionStoreKey); if (!string.IsNullOrWhiteSpace(filePath)) this.DefaultPath = filePath; } } }
//IniWriterFile
namespace ReadResourceFile.Code { public class IniWriter { [DllImport("kernel32")] static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); public static string IniRead(string strFilePath, string strSection, string strKey) { var RetVal = new StringBuilder(255); GetPrivateProfileString(strSection, strKey, string.Empty, RetVal, 255, strFilePath); return RetVal.ToString(); } public static void IniWrite(string strFilePath, string strSection, string strKey, string strValue) { WritePrivateProfileString(strSection, strKey, strValue, strFilePath); } public static void IniDeleteKey(string strFilePath, string strSection, string strKey) { IniWrite(strFilePath, strSection, strKey, null); } public static void IniDeleteSection(string strFilePath, string strSection) { IniWrite(strFilePath, strSection, null, null); } public static bool KeyExists(string strFilePath, string strSection, string strKey) { return !string.IsNullOrEmpty(IniRead(strFilePath, strSection, strKey)); } }
Không có nhận xét nào:
Đăng nhận xét