سلام دوستان من می خوام یه لیست باکسی از نام کاربری ها مانند یاهو مسنجر درست کنم باید چه کار کنم؟
می خوام عکس کاربری و نام کاربری را در این لیست وارد کنه و بتونه روش کلیک کنه و با کلیک بر روی هر کدارم از یوزر ها عملی را انجام دهد.
ممنون
وب
سلام دوستان من می خوام یه لیست باکسی از نام کاربری ها مانند یاهو مسنجر درست کنم باید چه کار کنم؟
می خوام عکس کاربری و نام کاربری را در این لیست وارد کنه و بتونه روش کلیک کنه و با کلیک بر روی هر کدارم از یوزر ها عملی را انجام دهد.
ممنون
وب
باید از WPF استفاده کنید.
چه طوری باید استفاده کنم دوست عزیز اگه میشه راهش را بگید من WPF بلد نیستم.
در ضمن می خوام توی Winform باشه آخه WPF کار نکردم؟
یک یوزر کنترل بسازید.
یک FlowLayoutPanel روی فرم قرار بدید و به ازای هر آیتم یک شئ از یوزرکنترل بسازید و بعد از مقداردهی به FlowLayoutPanel اضافه کنید. میتونید برای یوزرکنترل رویداد مورد نظر رو هم اضافه کنید.
WPF رو میشه در Winform هم استفاده کرد.
مشاهده کنید.
شما شروع کن هر جا مشکل داشتی بگو.
با سلام
من یه یوزر کنترل به شکل زیر درست کردم
Untitled.png
فرض کنیم یه datatable دارم که دارای ستونهای name, family, picture هست
الان چندتا مسئله دارم
1.فیلدهای دیتاتیبل رو توی جای خودشون روی یوزرکنترل بزاریم(picturebox, lblName,lblFamily)
2.برای هر رکورد دیتاتیبل، یوزر کنترل به FlowLayoutPanel اضافه کنیم
3.این یوزرکنترلها قابل انتخاب و دابل کلیک باشند
واقعا ممنون میشم اگه کمک کنید ، خیلی وقته دنبال همچین چیزی هستم
به ازای هر مشخصه ای که نیاز دارید یک پراپرتی ایجاد کنید:
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 اضافه میکنی. رویداد کلیک هم میتونی داخل همین حلقه بهش نسبت بدی. مشکلی داشتی کدی که نوشتی رو بزار.
سلامبعد از اینکه اطلاعات رو ریختی توی دیتاتیبل ، درون یک حلقه یک شئ از یوزرکنترل میسازی و از سلولهای سطر دیتاتیبل این پراپرتی ها رو پر میکنی و بعد به 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 نتونستم کاری کنم، راستش تا حالا ازش استفاده نکردم
در مورد دابل کلیک هم هیچ ایده ای ندارم
لطفا راهنمایی بفرمائین
داخل حلقه یوزرکنترل رو به مجموعه کنترلهای 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);
}
آخرین ویرایش به وسیله Mahmoud.Afrad : جمعه 29 بهمن 1395 در 04:03 صبح
از += تا انتهای خط رو پاک کن. دوباره += رو بزار و دوبار tab بزن تا رویداد ساخته بشه.
میتونی برای اونها هم رویداد جدا بنویسی.
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);
}
بهتره در قالب یک پروژه در قسمت نمونه برنامه های کوچک و مفيد در سي شارپ قرار بدید.