PDA

View Full Version : چگونه لیستی از یوزر ها مانند یاهو مسنجر درست کنیم؟



amin_sltny
چهارشنبه 11 اردیبهشت 1392, 09:01 صبح
سلام دوستان من می خوام یه لیست باکسی از نام کاربری ها مانند یاهو مسنجر درست کنم باید چه کار کنم؟

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

ممنون

وب (http://www.kanonportal.ir/)

_behnam_
چهارشنبه 11 اردیبهشت 1392, 10:05 صبح
باید از WPF استفاده کنید.

amin_sltny
چهارشنبه 11 اردیبهشت 1392, 11:22 صبح
چه طوری باید استفاده کنم دوست عزیز اگه میشه راهش را بگید من WPF بلد نیستم.

در ضمن می خوام توی Winform باشه آخه WPF کار نکردم؟

Mahmoud.Afrad
چهارشنبه 11 اردیبهشت 1392, 18:17 عصر
یک یوزر کنترل بسازید.
یک FlowLayoutPanel روی فرم قرار بدید و به ازای هر آیتم یک شئ از یوزرکنترل بسازید و بعد از مقداردهی به FlowLayoutPanel اضافه کنید. میتونید برای یوزرکنترل رویداد مورد نظر رو هم اضافه کنید.

_behnam_
چهارشنبه 11 اردیبهشت 1392, 18:22 عصر
WPF رو میشه در Winform هم استفاده کرد.
مشاهده کنید. (http://tech.pro/tutorial/799/wpf-tutorial-using-wpf-in-winforms)

JustAcMilan
چهارشنبه 11 اردیبهشت 1392, 18:23 عصر
یک یوزر کنترل بسازید.
یک FlowLayoutPanel روی فرم قرار بدید و به ازای هر آیتم یک شئ از یوزرکنترل بسازید و بعد از مقداردهی به FlowLayoutPanel اضافه کنید. میتونید برای یوزرکنترل رویداد مورد نظر رو هم اضافه کنید.
فکر خیلی خوبیه
میشه بیشتر توضیح بدین یا یه نمونه بزارین؟

Mahmoud.Afrad
چهارشنبه 11 اردیبهشت 1392, 19:29 عصر
شما شروع کن هر جا مشکل داشتی بگو.

JustAcMilan
پنج شنبه 12 اردیبهشت 1392, 12:14 عصر
شما شروع کن هر جا مشکل داشتی بگو.

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

فرض کنیم یه datatable دارم که دارای ستونهای name, family, picture هست
الان چندتا مسئله دارم
1.فیلدهای دیتاتیبل رو توی جای خودشون روی یوزرکنترل بزاریم(picturebox, lblName,lblFamily)
2.برای هر رکورد دیتاتیبل، یوزر کنترل به FlowLayoutPanel اضافه کنیم
3.این یوزرکنترلها قابل انتخاب و دابل کلیک باشند


واقعا ممنون میشم اگه کمک کنید ، خیلی وقته دنبال همچین چیزی هستم

Mahmoud.Afrad
پنج شنبه 12 اردیبهشت 1392, 16:29 عصر
به ازای هر مشخصه ای که نیاز دارید یک پراپرتی ایجاد کنید:

public partial class UserControl1 : UserControl
{
public string FirstName
{
get { return lblName.Text; }
set { lblName.Text = value; }
}
public string LastName
{
get { return lblFamily.Text; }
set { lblFamily.Text = value; }
}
public string ImageAddress
{
get { return pictureBox1.ImageLocation; }
set { pictureBox1.ImageLocation = value; }
}

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

JustAcMilan
پنج شنبه 12 اردیبهشت 1392, 23:20 عصر
بعد از اینکه اطلاعات رو ریختی توی دیتاتیبل ، درون یک حلقه یک شئ از یوزرکنترل میسازی و از سلولهای سطر دیتاتیبل این پراپرتی ها رو پر میکنی و بعد به FlowLayoutPanel اضافه میکنی. رویداد کلیک هم میتونی داخل همین حلقه بهش نسبت بدی. مشکلی داشتی کدی که نوشتی رو بزار.سلام
من پروپرتی هارو به صورت زیر تغییر دادم
public string FullName
{
get { return lblName.Text; }
set { lblName.Text = value; }
}
public string Phone
{
get { return lblPhone.Text; }
set { lblPhone.Text = value; }
}
public string ID
{
get { return lblID.Text; }
set { lblID.Text = value; }
}
public Image Photo
{
get { return pictureBox1.Image; }
set { pictureBox1.Image = value; }
}

بعدش حلقه for رو به صورت زیر نوشتم
for (int i = 0; i <= objDataTable.Rows.Count; i++)
{
MyUserControl.MyUser user = new MyUserControl.MyUser();
user.FullName = objDataTable.Rows[i]["name"].ToString() + objDataTable.Rows[i]["family"].ToString();
user.Phone = objDataTable.Rows[i]["phone"].ToString();
user.ID = objDataTable.Rows[i]["id"].ToString();

byte[] arrPic = (byte[])(objDataTable.Rows[i]["photo"]);
MemoryStream ms = new MemoryStream(arrPic);
user.Photo = Image.FromStream(ms);
}


اما برای اضافه کردن به FlowLayoutPanel نتونستم کاری کنم، راستش تا حالا ازش استفاده نکردم

در مورد دابل کلیک هم هیچ ایده ای ندارم
لطفا راهنمایی بفرمائین

Mahmoud.Afrad
جمعه 13 اردیبهشت 1392, 00:22 صبح
داخل حلقه یوزرکنترل رو به مجموعه کنترلهای FlowLayoutPanel اضافه کن.

flowLayoutPanel1.SuspendLayout();
for (int i = 0; i < objDataTable.Rows.Count; i++)
{
MyUserControl.MyUser user = new MyUserControl.MyUser();
user.FullName = objDataTable.Rows[i]["name"].ToString() + objDataTable.Rows[i]["family"].ToString();
user.Phone = objDataTable.Rows[i]["phone"].ToString();
user.ID = objDataTable.Rows[i]["id"].ToString();
MemoryStream ms = new MemoryStream((byte[])(objDataTable.Rows[i]["photo"]));
user.Photo = Image.FromStream(ms);
user.DoubleClick += new EventHandler(user_DoubleClick);
flowLayoutPanel1.Controls.Add(user);
}
flowLayoutPanel1.ResumeLayout(true);


void user_DoubleClick(object sender, EventArgs e)
{
MyUserControl.MyUser user = sender as MyUserControl.MyUser;
MessageBox.Show(user.FullName);
}

JustAcMilan
جمعه 13 اردیبهشت 1392, 23:16 عصر
داخل حلقه یوزرکنترل رو به مجموعه کنترلهای FlowLayoutPanel اضافه کن.
با سلام مرسی از کمکتون
به خوبی کار می کنه ولی دابل کلیکش به هیچ وجه جواب نمیده
چندتا سوال داشتم اول اینکه uc تو دستور زیر از کجا اومده
user.DoubleClick += new EventHandler(uc_DoubleClick);

دوم اینکه رویداد دابل کلیک رو کجا بزارم

Mahmoud.Afrad
جمعه 13 اردیبهشت 1392, 23:29 عصر
از += تا انتهای خط رو پاک کن. دوباره += رو بزار و دوبار tab بزن تا رویداد ساخته بشه.

JustAcMilan
شنبه 14 اردیبهشت 1392, 02:15 صبح
از += تا انتهای خط رو پاک کن. دوباره += رو بزار و دوبار tab بزن تا رویداد ساخته بشه.
یه مشکل دیگه هم دارم (آخریشه قول میدم)

دابل کلیک فقط موقعی عمل میکنه که توی قسمت خالی یوزر کنترل کلیک کنم (واسه label و picturebox کار نمی کنه)
چیکار کنم؟

Mahmoud.Afrad
شنبه 14 اردیبهشت 1392, 02:39 صبح
میتونی برای اونها هم رویداد جدا بنویسی.

flowLayoutPanel1.SuspendLayout();
for (int i = 0; i <= objDataTable.Rows.Count; i++)
{
MyUserControl.MyUser user = new MyUserControl.MyUser();
user.FullName = objDataTable.Rows[i]["name"].ToString() + objDataTable.Rows[i]["family"].ToString();
user.Phone = objDataTable.Rows[i]["phone"].ToString();
user.ID = objDataTable.Rows[i]["id"].ToString();
MemoryStream ms = new MemoryStream((byte[])(objDataTable.Rows[i]["photo"]));
user.Photo = Image.FromStream(ms);
user.DoubleClick += new EventHandler(user_DoubleClick);
foreach (Control c in user.Controls)
{
c.DoubleClick += new EventHandler(c_DoubleClick);
}
flowLayoutPanel1.Controls.Add(user);
}
flowLayoutPanel1.ResumeLayout(true);

این هم متدهای رویدادها. در متد مربوط به رویداد لیبل ها و پیکچر باکس میتوان از طریق Parent این کنترل ها به یوزرکنترل دست پیدا کرد. Parent همان یوزرکنترل هست.

void user_DoubleClick(object sender, EventArgs e)
{
MyUserControl.MyUser muc = sender as MyUserControl.MyUser;
MessageBox.Show(muc.FullName);
}
void c_DoubleClick(object sender, EventArgs e)
{
Control doubleClickedControl = sender as Control;
MyUserControl.MyUser muc = doubleClickedControl.Parent as MyUserControl.MyUser;
MessageBox.Show(muc.FullName);
}

JustAcMilan
شنبه 14 اردیبهشت 1392, 02:50 صبح
این هم متدهای رویدادها. در متد مربوط به رویداد لیبل ها و پیکچر باکس میتوان از طریق Parent این کنترل ها به یوزرکنترل دست پیدا کرد. Parent همان یوزرکنترل هست.


واقعا دکمه تشکر نمی تونه تشکر منو ابراز کنه؛ مرسی که جواب دادین

من از این روش برای autocomplete Search استفاده کردم ، خیلی وقت بود دنبالش میگشتم، چیز خوبی از آب در اومد
اگه مایل باشید توی یک تایپک بزارم، شاید دوستان تازه کار مثه خودم ازش استفاده کنن

Mahmoud.Afrad
شنبه 14 اردیبهشت 1392, 03:03 صبح
بهتره در قالب یک پروژه در قسمت نمونه برنامه های کوچک و مفيد در سي شارپ (http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE) قرار بدید.