PDA

View Full Version : مشكل در useraccount switching در برنامه



amir.khanlari
جمعه 30 بهمن 1388, 13:58 عصر
با سلام .
من در برنامم يكي از منو هارو تعويض حساب كاربري قرار دادم كه با استفاده از آن كاربر مي تواند حسابي كه با آن وارد برنامه شده است را عوض نمايد مثلا از اپراتور به مدير . پس از انتخاب اين منو صفحه ورود به برنامه ظاهر مي شود و كاربر مشخصات ورود خود را وارد مي كند و ارزيابي حساب كاربري انجام مي شود و صفحه ورود به برنامه بسته مي شود و بايد فرم اصلي نمايش داده شود مشكلي كه وجود دارد اين است كه فرم ورود بسته مي شود اما فرم اصلي نمايش داده نمي شود و برنامه همچنان در حال اجرا مي ماند .
لطفا راهنمايي كنيد

arta.nasiri
جمعه 30 بهمن 1388, 19:26 عصر
سلام

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

amir.khanlari
جمعه 30 بهمن 1388, 20:53 عصر
سلام

من از restart استفاده میکنم یعنی وقتی روی دکمه تعویض کاربر کلیک میکنم یک بار برنامه restart میشه و کاربر میتونه دوباره با ورود مشخصات وارد بشه
ممنون از توجهي كه داريد .منم از restart استفاده كردم . و جاي تعجب اين است كه همه چي درست كار مي كنه فقط بعداز تاييد حساب كاربري توسط برنامه ديگر فرم اصلي نمايش داده نمي شود .

arta.nasiri
دوشنبه 03 اسفند 1388, 19:13 عصر
سلام

قبل از اینکه فرم ورود رو ببندی با دستور show)( فرم اصلی رو ظاهر کن

اگه کد صفحه ورود رو بزاری بیشتر میتونم راهنماییت بکنم

amir.khanlari
دوشنبه 03 اسفند 1388, 20:34 عصر
با سلام
براي فرم ورود از usercontrol آقاي sinpin كه در همين سايت گذاشته بودن استفاده كردم كه در لينك زير مي تونيد مشاهده كنيد البته يكم تغييرش دادم
http://barnamenevis.org/forum/showthread.php?t=94791
از تابع زيربراي اعتبار سنجي مشخصات وارد شده استفاده مي كنم :

public bool IsAuthentic(string UserId, string Password,string level)
{

SqlDataAdapter useradapter = new SqlDataAdapter();
useradapter.SelectCommand = new SqlCommand();
useradapter.SelectCommand.CommandText = "select * from useraccount where "
+ "username=@username and password=@password and leveluser=@leveluser";
useradapter.SelectCommand.Connection = connstring.connectionstr;
useradapter.SelectCommand.Parameters.AddWithValue("@username", UserId);
useradapter.SelectCommand.Parameters.AddWithValue("@password", Password);
useradapter.SelectCommand.Parameters.AddWithValue("@leveluser", level);
useradapter.Fill(table);
if (table.Rows.Count != 0)
{
return true;
}
return false;
}
از تابع زير هم براي اعمال سطح دسترسي هاي كاربر استفاده مي كنم


public void mainformshow()
{

mainmdiform mdiform = new mainmdiform();
userlevel.delete = Convert.ToBoolean(table.Rows[0]["delete"]);
userlevel.addnew = Convert.ToBoolean(table.Rows[0]["insert"]);
userlevel.edit = Convert.ToBoolean(table.Rows[0]["edit"]);
userlevel.report = Convert.ToBoolean(table.Rows[0]["report"]);
userlevel.listview = Convert.ToBoolean(table.Rows[0]["listview"]);
Registry.CurrentUser.CreateSubKey(@"Software\SepehrSoftware\HospitalMangementSystem");
Registry.SetValue(@"HKEY_CURRENT_USER\Software\SepehrSoftware\Hospital MangementSystem", "Userentered",loginControl1.Controls["useridtxt"].Text, RegistryValueKind.String);
Registry.SetValue(@"HKEY_CURRENT_USER\Software\SepehrSoftware\Hospital MangementSystem", "Userlevel",loginControl1.Controls["userlevelcombo"].Text, RegistryValueKind.String);
var hospitalname = Convert.ToString(Registry.GetValue(@"HKEY_CURRENT_USER\Software\SepehrSoftware\Hospital MangementSystem", "namehospital", ""));
if (hospitalname == "")
Registry.SetValue(@"HKEY_CURRENT_USER\Software\SepehrSoftware\Hospital MangementSystem", "namehospital",loginControl1.Controls["hospiyalnametxt"].Text, RegistryValueKind.String);

}
در تابع بالا userlevel يك كلاس هست كه متغيير هايي از نوع استاتيك درونش هست


private int nTry = 0;
private void loginControl1_LoginEvent(object sender, LoginEventArgs e)
{

switch (e.EventType)
{
case LoginEventTypes.Successed:
this.DialogResult = DialogResult.OK;
mainformshow();
break;
case LoginEventTypes.Failed:
if (nTry++ > 2)
{
MessageBox.Show("متاسفانه شما سه بار پياپي نام كاربري ويا كلمه عبور را اشتباه وارد كرديد با مديريت تماس بگيريد", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Opacity = 1;
for (int i = 0; i < 100; i++)
{
this.Opacity -= 0.01;
Application.DoEvents();
}
this.DialogResult = DialogResult.Abort;

}
else
{
MessageBox.Show(string.Format("{0}: You have {1} times to try again...", e.LoginDate, (3 - nTry + 1).ToString()));
loginControl1.Controls["passtxt"].Text = "";
loginControl1.Controls["useridtxt"].Focus();
loginControl1.Controls["userlevelcombo"].Text = "";
}
break;
case LoginEventTypes.Cancel:
this.DialogResult = DialogResult.Ignore;
this.Opacity = 1;
for (int i = 0; i < 100; i++)
{
this.Opacity -= 0.01;
Application.DoEvents();
}

Application.Exit();
break;
default:
break;
}
}


public void btnLogin_Click(object sender, EventArgs e)
{
passgenerator();
bool result = false;
Control parent = this.Parent;
if (!(parent is IAuthentication))
return;
result = (parent as IAuthentication).IsAuthentic(userid, pass,userlevelcombo.Text.Trim());
if (result)
OnLoginEvent(LoginEventTypes.Successed);
else
OnLoginEvent(LoginEventTypes.Failed);
}

در program.cs هم در تابع main اين كد هارو وارد كردم


static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
CultureInfo FarsiCulture = new CultureInfo("fa-IR");
Application.CurrentInputLanguage = InputLanguage.FromCulture(FarsiCulture);
frmlogin login = new frmlogin();
if (login.ShowDialog() == DialogResult.OK)
Application.Run(new mainmdiform());

}
اگر از لحاظ اصول برنامه نويسي هم در جايي مشكلي مي بينيد ممنون ميشم اگر متذكر عنوان كنيد
ممنون ميشم اگر مشكلوم برطرف كنيد

Warrior
دوشنبه 03 اسفند 1388, 20:40 عصر
ببخشید پا به رهنه می پرم وسط بحث ولی یک سوال داشتم و یک راهنمایی.

سوال اینکه فرق show با showdialog در چیست؟

راهنمایی اینکه تا جایی که من می دانم شما برای انجام این کار باید فرم قبلی را ببندی و باز کنی.
البته نمی دانم این کار اصولی است یا نه ولی من این کار را می کنم(البته تا به حال کاربر سویچ نکرده ام ببینم به مشکلی بر می خورد یا نه) :

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


FormeUser fr = new FormeUser();
ActiveForm.Hide();
fr.ShowDialog();
ActiveForm.Show();
اینطوری وقتی روی دکمه کلیک می کنید فرم اصلی ناپدید می شود و وقتی فرم کاربر بسته می شود فرم اصلی خود به خود ظاهر می شود.

راستی, منظور شما از restart همان Application.Restart(); است؟

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

با تشکر

amir.khanlari
دوشنبه 03 اسفند 1388, 21:37 عصر
در مورد سوال اولتون :
فرمي كه آن را showdialog مي كنيد تا زماني كه بسته نشود بر روي ساير فرم ها مي ماند و ديگر نمي توانيد از ساير فرم ها استفاده نماييد
منظور از restart همان application.restart() بود
اگر من فرم اصلي را ببندم كه برنامه بسته مي شود از اين ايده فكر نكنم بشود استفاده كرد و اگر منظورتون hide كردن هست اونو امتحان كردم جواب نمي ده
در مورد اعمال سطح دسترسي در سايت هم متاسفانه سايت كار نكردم .
ممنون از توجهي كه كرديد

Warrior
سه شنبه 04 اسفند 1388, 12:41 عصر
در مورد سوال اولتون :
فرمي كه آن را showdialog مي كنيد تا زماني كه بسته نشود بر روي ساير فرم ها مي ماند و ديگر نمي توانيد از ساير فرم ها استفاده نماييد
منظور از restart همان application.restart() بود
اگر من فرم اصلي را ببندم كه برنامه بسته مي شود از اين ايده فكر نكنم بشود استفاده كرد و اگر منظورتون hide كردن هست اونو امتحان كردم جواب نمي ده
در مورد اعمال سطح دسترسي در سايت هم متاسفانه سايت كار نكردم .
ممنون از توجهي كه كرديد

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

ممنونم

amir.khanlari
سه شنبه 04 اسفند 1388, 22:37 عصر
من از يك جدول براي ذخيره نام كاربري و رمز ورود و سطوح دسترسي استفاده مي كنم . سطوح دسترسي هم در موقع ثبت كاربر جديد با استفاده از چك باكس هايي كه در فرم قرار دادم از مدير برنامه مي گيرم ودرموقع log in اونها رو با استفاده از توابعي كه در پست 6 گذاشتم در فرم اصلي اعمال مي كنم

حالا كسي نمي تونه مشكله منو حل كنه ؟ چرا فرم اصلي بعد از تعويض كاربري نمايش داده نمي شود
دوستان لطفا كمك كنيد

amir.khanlari
پنج شنبه 06 اسفند 1388, 11:07 صبح
مشكل حل شد از دوستاني كه كمك كردند ممنونم