1399-01-06 22:27 مشکلات نهایی و ساده برنامه من
booysusa

 
با درود
نوروز را به همه بچه های انجمن سیمرغ شاد باش میگم
آرزو دارم سال خوبی برای همه ملت های جهان به ویژه ایرانیان باشد، آمین


مهندس شریفی گرامی با عرض پوزش من فک کنم سر این برنامه بسیار شما رو اذیت کردم
حقیقتش من سه تا مشکل اساسی دارم که امیدوارم با کمک شما بتونم این مرحله رو هم طی کنم (نوشتم ساده چون برای شما ساده و برای من بسیار سخت )

برای اکثر مشکلات راه پیدا کردم ولی این سه تا ندیدم کسی زیاد تو اینترنت در موردشون صحبت کنه تا بتونم استفاده کنم

تو برنامه مشکلاتم رو توضیح دادم، سپاسگزار میشم مهندس شریفی اصلاحشون کنید
جسارت نباشه فقط خواهشا به همون سبکی که توی فرم نوشتم اگر ممکنه ویرایش و راهنماییم کنید، زیرا شما کدنویسیتون عالی هست و ما هنوز ابتدایی

خلاصه مشکلات بگم شاید مشکل سایر دوستان هم باشه و بدردشون بخوره:
میخوام با استفاده از گرید ، سایت هایی که ذخیره هستن رو سایت باز کنم
شیوه درست نوشتن تاریخ شمسی و نمایش اون در گرید و ماسکد باکس
شیوه صحیح ذخیره چک باکس و تکست باکس روی فرم

لینک دانلود
1399-01-12 22:59
حاجی شریفی
مؤسس سایت
 
سلام
سال جدید را خدمت شما و کلیه دوستان تبریک عرض میکنم.
انشاا... برخلاف شروع اش، سالی پربرکت و توام با صحت و سلامتی باشد.

نقل قول نوشته شده توسط: booysusa
شیوه درست نوشتن تاریخ شمسی و نمایش اون در گرید و ماسکد باکس ... مشکل این فرم این است که بعد از زدن دکمه ویرایش، تاریخ با ساعت و و دقیقه میرود و فرم بهم میخورد

وقتی شما از کنترلری مانند GlobalizationDateTimePicker استفاده میکنید نباید خودتان دستی Text در آن بریزید
باید مقدار DateTime را تحویل خصیصه Value یا DbValue آن بدهید.
this .mskTarikhSabt.DbValue = this .dgvHesabMain.CurrentRow.Cells["ClmnTarikh_HesabMain"].Value ;


نقل قول نوشته شده توسط: booysusa
میخوام با استفاده از گرید ، سایت هایی که ذخیره هستن رو سایت باز کنم ... مشکل این فرم این است که با زدن دکمه باز کردن سایت سایت باز نمیشود

کافی است برای رویدادی مانند CellContentClick در گرید کد نویسی کنید، کدی شبیه این
if  (e.ColumnIndex != 2) return ;
string url = this .dgvSite.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() ;
if (string .IsNullOrEmpty(url)) return ;
System.Diagnostics.Process.Start(url) ;


نقل قول نوشته شده توسط: booysusa
همچنین ممکن است یک دسته از سایت های خاص را جستجو کنیم و با زدن دکمه باز کردن همه سایت ها باید اون سایت هایی که جستجو شده باز شودند

باید یک دکمه اضافه روی فرم برای "باز کردن همه سایت ها" تعبیه کنید که در حلقه foreach فرمان Process.Start را روی همه آدرس ها اجرا کند.

نقل قول نوشته شده توسط: booysusa
شیوه صحیح ذخیره چک باکس و تکست باکس روی فرم ... با زدن دکمه ورود، چک باکس ها درون دیتابیس ذخیره شوند

برای ذخیره مواردی مانند "مرا به خاطر بسپار" معمولا از دیتابیس استفاده نمیشود
یا حداقل به تنهایی از دیتابیس استفاده نمیشود.

نکته اول)
از نظر مفهومی صحیح نیست که کلید گاوصندوق را درون گاوصندوق نگهداری کرد.

نکته دوم)
چون این موارد per User و per Machine است.
یعنی برای هر کاربرد و هر رایانه جداگانه ذخیره میشود
شما روی فلان رایانه با فلان user لاگین کرده اید و این ارتباطی با سایر رایانه ها و سایر user ها ندارد.

پس موارد این چنینی را باید دستی در یک فایل ذخیره کنید.
البته خود دات نت هم بخشی برای مدیریت ذخیره و خواندن این موارد دارد

به Project > Properties بروید و سطرهای زیر را ایجاد کنید
و سطرهای زیر را ایجاد کنید



سپس میتوانید در سازنده فرم کدی شبیه این بنوسید:
public  frmChek()
{
this .InitializeComponent();

this .cbxShowPass.Checked = Properties.Settings.Default.ShowPass;
this .txtUserName.Text = Properties.Settings.Default.Username;
this .txtPassword.Text = Properties.Settings.Default.Password;
this .chkRemember_frmLogin.Checked = (!string .IsNullOrEmpty(this.txtUserName.Text)) || (!string .IsNullOrEmpty(this.txtPassword.Text)) ;
}


و در پایان لاگین موفق هم کدی شبیه این:
private void  btnLogin_Click(object  sender, EventArgs e)
{
//...
//Login Code
//...

Properties.Settings.Default.ShowPass = this .cbxShowPass.Checked;
Properties.Settings.Default.Username = this .chkRemember_frmLogin.Checked ? this .txtUserName.Text : null ;
Properties.Settings.Default.Password = this .chkRemember_frmLogin.Checked ? this .txtPassword.Text : null ;
Properties.Settings.Default.Save();
}


تنها ایراد روش ساده فوق آن است که این اطلاعات در یک فایل در درایو C و بدون رمزنگاری ذخیره میشود.
یعنی اگر کسی دسترسی داشته باشد و بداند کجا را نگاه کند میتواند User,Pass را پیدا کند.
که برای رفع مشکل باید قبل و بعد خواندن User,Pass در کدهای فوق از رمزنگاری استفاده کرد.
موفق باشید.
1399-01-13 10:55
booysusa

 
درود بر شما
نقل قول
انشاا... برخلاف شروع اش، سالی پربرکت و توام با صحت و سلامتی باشد.

سپاسگزارم همچنین

نقل قول
وقتی شما از کنترلری مانند GlobalizationDateTimePicker استفاده میکنید نباید خودتان دستی Text در آن بریزید

بله درست شد، ولی گریدویو چطوری تاریه رو شمسی نشون بدیم مهندس شریفی؟

نقل قول
کافی است برای رویدادی مانند CellContentClick در گرید کد نویسی کنید، کدی شبیه این

سپاس فقط پشت دکمه باز کردن چه کدی بنویسم؟

نقل قول
باید یک دکمه اضافه روی فرم برای "باز کردن همه سایت ها" تعبیه کنید که در حلقه foreach فرمان Process.Start را روی همه آدرس ها اجرا کند.

کدشو میگید ؟

نقل قول
البته خود دات نت هم بخشی برای مدیریت ذخیره و خواندن این موارد دارد

از راهنمایی خوب شما استفاده کردم و بسیار عالی بود

نقل قول
که برای رفع مشکل باید قبل و بعد خواندن User,Pass در کدهای فوق از رمزنگاری استفاده کرد.

مهندس من قبلا یه همچین چیزی ساده ای برای رمزنگاری استفاده میکردم

الان چطوری اینو رمزنگاری کنم؟ حتی ساده هم باشه خوبه فقط حداقل اندکی رمزنگاری شده باشه

this.cbxShowPass.Checked = Properties.Settings.Default.ShowPass;
this.txtUserName.Text = Properties.Settings.Default.Username;
this.txtPassword.Text = Properties.Settings.Default.Password;
this.chkRemember_frmLogin.Checked = (!string.IsNullOrEmpty(this.txtUserName.Text)) || (!string.IsNullOrEmpty(this.txtPassword.Text));

Properties.Settings.Default.ShowPass = this.cbxShowPass.Checked;
Properties.Settings.Default.Username = this.chkRemember_frmLogin.Checked ? this.txtUserName.Text : null;
Properties.Settings.Default.Password = this.chkRemember_frmLogin.Checked ? this.txtPassword.Text : null;
Properties.Settings.Default.Save();


سپاس که همیشه نوری در تاریکی های ما هستید
1399-01-13 13:05 AES Encrypt/Decrypt String Data With Password
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
سپاس فقط پشت دکمه باز کردن چه کدی بنویسم؟ ... کدشو میگید ؟

دستور پیشنهادی CellContentClick را که برایتان فرستادم، گمانم منظورتان آن دکمه ای است که همه سایت ها را با هم باز کند.
خیلی ساده است، کافی است روی منبع اصلی اطلاعات foreach بزنید
الآن منبع اصلی اطلاعات شما، جاییکه همه سطرها در آن قرار دارد شیء m_BindingSource است.
پس برای الآن دستور چیزی شبیه این میشود
foreach  (CafeNetManagement.Models.Jadvalha.Site row in this .m_BindingSource)
{
if (string .IsNullOrEmpty(row.AdressSite)) continue ;
System.Diagnostics.Process.Start(row.AdressSite) ;
}


نقل قول نوشته شده توسط: booysusa
الان چطوری اینو رمزنگاری کنم؟ حتی ساده هم باشه خوبه فقط حداقل اندکی رمزنگاری شده باشه

اطلاعات قبل و بعد خواندن تحویل توابع زیر User,Pass بدهید
private static string  Encrypt(string  cleanData, string  pass = "123")
{
if (string .IsNullOrEmpty(cleanData)) return string .Empty;

byte [] iv = new byte [16];
byte [] key = new byte [32];
using (var hash = SHA384.Create())
{
byte [] buff = hash.ComputeHash(Encoding.UTF8.GetBytes(pass));
Buffer.BlockCopy(buff, 0, iv, 0, 16);
Buffer.BlockCopy(buff, 16, key, 0, 32);
}

byte [] data = Encoding.UTF8.GetBytes(cleanData);
using (var aes = Aes.Create())
{
aes.IV = iv;
aes.Key = key;
using (var enc = aes.CreateEncryptor())
data = enc.TransformFinalBlock(data, 0, data.Length);
}
return Convert.ToBase64String(data);
}

private static string Decrypt(string encData, string pass = "123")
{
if (string .IsNullOrEmpty(encData)) return string .Empty;

byte [] iv = new byte [16];
byte [] key = new byte [32];
using (var hash = SHA384.Create())
{
byte [] buff = hash.ComputeHash(Encoding.UTF8.GetBytes(pass));
Buffer.BlockCopy(buff, 0, iv, 0, 16);
Buffer.BlockCopy(buff, 16, key, 0, 32);
}

byte [] data = Convert.FromBase64String(encData);
using (var aes = Aes.Create())
{
aes.IV = iv;
aes.Key = key;
using (var enc = aes.CreateDecryptor())
data = enc.TransformFinalBlock(data, 0, data.Length);
}
return Encoding.UTF8.GetString(data);
}

1399-01-14 10:34
booysusa

 
نقل قول
اطلاعات قبل و بعد خواندن تحویل توابع زیر User,Pass بدهید

سپاس مهندس ولی متوجه نشدم چطوری باید استفاده بشن در فرم. محل قرار گیری و...
احتمالا باید بیشتر مطالعه کنم
1399-01-14 12:55
حاجی شریفی
مؤسس سایت
 
Properties.Settings.Default.Username = this .chkRemember_frmLogin.Checked ? Encrypt(this .txtUserName.Text) : null ;
Properties.Settings.Default.Password = this .chkRemember_frmLogin.Checked ? Encrypt(this .txtPassword.Text) : null ;
...
this .txtUserName.Text = Decrypt(Properties.Settings.Default.Username);
this .txtPassword.Text = Decrypt(Properties.Settings.Default.Password);
1399-01-14 17:58
booysusa

 
ببخشید
1399-01-14 18:17
حاجی شریفی
مؤسس سایت
 
سلام
احتمالا دیتاهای قبلی که رمزنبوده اند در Settings تان ذخیره شده و حالا که برنامه میخواهد آن را با کد جدید رمزگشایی کند به خطا می خورد...
یا یکبار با کد قبلی هر دو string را خالی کرده و save کنید.
یا دستورات جدید را در try-catch قرار دهید و از خطای فعلی صرف نظر کنید.
یکبار درست و با کد Encrypt ذخیره شود، سپس کد Decrypt میتواند کار کند.
1399-01-14 20:03
booysusa

 
نقل قول
یا یکبار با کد قبلی هر دو string را خالی کرده و save کنید.

با این روش انجام دادم درست شد
عااااااااااااااااااااالی مهندس بی نهایت سپاسگزارم از شما، کلی گشته بودم، با اینکه کارکرد خوبی هست برای برنامه ها ولی کسی در موردش چیزی ننوشته بود، البته شاید برای خیلی ها کار اسانی باشه برای همین بهش نپرداخته بودن ، ولی میدونم خیلی ها مثل من هستن که این قسمت رو نیاز دارن، امیدوارم کسانی که مشکل منو داشتن با دیدن این تاپیک مشکلشون حل بشه و برای برنامشون استفاده کنن.


فقط مهندس واقعاااا ببخشید ، پشت باتون این کد رو گذاشتم برای باز کردن همه سایت ها در گرید ویو، ولی عمل نکرد و وقتی میزنمش اتفاقی نمی افته
foreach  (CafeNetManagement.Models.Jadvalha.Site row in this .m_BindingSource)
{
if (string .IsNullOrEmpty(row.AdressSite)) continue ;
System.Diagnostics.Process.Start(row.AdressSite) ;
}


برای دکمه باز کردن سایت هم همین مشکل رو دارم


ولی کد زیر برای اینکه روی گرید کلیک کنم مناسب هست و عمل میکنه
if  (e.ColumnIndex != 2) return ;
string url = this .dgvSite.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() ;
if (string .IsNullOrEmpty(url)) return ;
System.Diagnostics.Process.Start(url) ;
1399-01-14 23:08
booysusa

 
از این کدها برای باز کردن سایت از درون گرید استفاده کردم و درست کار کردن
مهندس کدها مشکلی ندارن؟

کد باز کردن یک سایت با باتون
        private void btnOpenSite_Click(object sender, EventArgs e)
{
string _Web_Address = "";

_Web_Address = dgvSite.SelectedRows[0].Cells[2].Value.ToString();

if (string.IsNullOrWhiteSpace(_Web_Address) == false)
{
System.Diagnostics.Process.Start(_Web_Address);
}
}


با کردن همه سایت های موجود در گرید با باتون

        private void btnOpenAllSite_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow dr in dgvSite.Rows)
{
string _Web_Address = "";

_Web_Address = dr.Cells[2].Value.ToString();

if (string.IsNullOrWhiteSpace(_Web_Address) == false)
{
System.Diagnostics.Process.Start(_Web_Address);
}
}
}
1399-01-15 20:25
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
پشت باتون این کد رو گذاشتم برای باز کردن همه سایت ها در گرید ویو، ولی عمل نکرد و وقتی میزنمش اتفاقی نمی افته

باید foreach فوق را روی منبع/DataSource اطلاعات بزنید.
در اولین پست هم به همین دلیل کد را ننوشته بودم.
باید ببینید DataGridView با چه چیزی پر میشود؟
چه شی ای را داخل DataGridView.DataSource ریخته اید؟
روی همان شیء باید foreach بزنید.

الان چه چیزی سمت راست مساوی DataGridView.DataSource قرار دارد؟

نقل قول نوشته شده توسط: booysusa

با کردن همه سایت های موجود در گرید با باتون
foreach (DataGridViewRow dr in dgvSite.Rows)

اگر تست کرده اید و کار میکند که همین را قرار دهید، مهم نیست.

ولی از منظر اصول معماری نرم افزار (Software Architecture) این کار صحیح نیست
حتی همان دستور که برای کلیک ستون داخل گرید هم خودم برایتان نوشتم آن هم درست نیست
نباید دیتایی که خودمان Typed با فیلد Jadvalha.Site.AdressSite به گرید داده اید را با دستور dgvSite.SelectedRows[0].Cells[2].Value به صورت object از گرید گدایی کنیم
اگر فیلدی را بخواهید که روی گرید قرار ندارد چه؟ یعنی برای اینکه برنامه کار کند باید همه فیلدهای دیتابیس را به کاربر نشان دهیم؟ حق ندارید ستونی را مخفی کنیم؟ این که خیلی بد است.

اگر بخواهیم ستون ها را در UI جابجا کنم ، چه میشود؟ باید یادم باشد و بیاییم اعداد ایندکس ها را تغییر دهیم ؟!
این یعنی اگر من یک چیز بی ربط مانند چیدمان UI را تغییر دهم ، کد دیگر کار نمیکند ! چند ماه بعد خود برنامه نویس هم جرات نمیکند برنامه را edit کند.
maintenance و reusability چه میشود؟ چند ماه بعد اگر ایرادی و تصحیحی نیاز باشد به این فکر نمی افتید که بیخیال بگذار یکبار دیگر از اول بنوسیم؟
میخواهم عرض کنم که یک دستور شاید در ظاهر کار کند ولی رعایت اصول مهندسی نرم افزار و معماری بسیار مهم است.


موفق باشید.
1399-01-21 20:48
booysusa

 
بی نهایت سپاس مهندس
مشکلم رو باز حل کردید