PDA

View Full Version : چگونگی کار با UserControl و کنترل TreeView



gwbasic
پنج شنبه 14 مهر 1390, 18:14 عصر
سلام
یه پروژه کوچیک گذاشتم برای کار با TreeView و همچنین ساختن User Control
دیدنش خالی از لطف نیست می تونه جنبه آموزشی داشته باشه

76310

این فرم دارای یک کنترل TreeView هست که با RightClick روی node های اون ContextMenu باز شده و متناسب با آن node که می تونه دانش آموز یا استاد باشه می شه اقدام به اضافه کردن دانش آموز یا استاد کرد و در صورت افزودن هر کدام یک UserControl در قسمت جزئیات نمایش داده می شه که جزئیات شخص رو می شه اونجا وارد کرد و با تغییر مثلا نام شخص همزمان treeView نیز این تغییرات رو نمایش میده

هدف از این کار صرفا آشنایی برخی از دوستان که با این کنترل ها آشنا نیستن هست و همینطور کار با داده ها در فرم.

امیدوارم مفید باشه

مطالب مرتبط:
http://barnamenevis.org/showthread.php?305048-پروژه-ثبت-اطلاعات-شخصی
http://barnamenevis.org/showthread.php?292845-دانلود-کنید-نمایش-پرچم-کشورها
http://barnamenevis.org/showthread.php?292694-ساختن-فرم-با-استفاده-از-Data-Binding
http://barnamenevis.org/showthread.php?288558-آموزش-Data-Binding

shahrzad87
جمعه 15 مهر 1390, 19:36 عصر
مرسی!
واقعا خیلی عالی و خیلی خیلی مفید بود، خیلی بهم کمک کرد. :لبخندساده:

shahrzad87
شنبه 16 مهر 1390, 09:52 صبح
چطور می شه با دیتابیس ارتباطش داد که مثلا نود های دانش آموز رو به ترتیب بر اساس شماره ایندکسشون همراه با نام استاد در جدول اضافه کنه ؟؟ و نام استادها رو هم بر اساس شماره ایندکس با اسم مدرسه توی جدول دیگه ذخیره کنه ؟؟

shahrzad87
شنبه 16 مهر 1390, 11:16 صبح
یکی از userControl ها رو نمی تونم رو فرم بذارم، این پیغام رو می ده :


cannot bind to the property or column name on the datasource . parameter name : datamember

shahrzad87
شنبه 16 مهر 1390, 11:20 صبح
کد UC این هست :

اگر لازمه کد کلاس node و numbers رو هم کپی کنم ؟



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using IVR.Models;

namespace IVR.UserControls
{
public partial class NumberUC : UserControl
{
private BindingSource numberBS;
private Numbers number;
public Numbers Number
{
get { return number; }
set
{
if (number != value)
{
number = value;
numberBS.DataSource = number;
}
}
}

public NumberUC()
:this(Numbers.UnknownNumbers)
{
}

public NumberUC(Numbers number)
{
InitializeComponent();
playwavUC1.Hide();


this.number = number;
Initialize();
InitBinding();
}

private void Initialize()
{
if (number == null)
number = new Numbers();

numberBS = new BindingSource();
numberBS.DataSource = number;
}

private void InitBinding()
{
lblNum.DataBindings.Add("Text", numberBS, "Name", false, DataSourceUpdateMode.OnPropertyChanged);
cmbActionNum .DataBindings .Add ("SelectedItem",numberBS ,"Name", false , DataSourceUpdateMode.OnPropertyChanged);
}

private void cmbActionNum_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbActionNum.SelectedItem == "پخش صوت")
playwavUC1.Show();
}

private void btn1_Click(object sender, EventArgs e)
{
lblNum.Text = "1";
}
}
}



درست کار می کرد نمی دونم چه کدی رو تغییر دادم که اینجوری شد :|

shahrzad87
شنبه 16 مهر 1390, 11:36 صبح
این هم کد کلاس numbers که نوشتم :




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace IVR.Models
{
public class Numbers : INotifyPropertyChanged
{

private string number;
public string Number
{
get { return number; }
set
{
if (number != value)
{
number = value;
OnpropertyChanged("Number");
}
}
}

private string action;
public string Action
{
get { return action; }
set
{
if (action != value)
{
action = value;
OnpropertyChanged("Action");
}
}
}

private string fname;
public string Fname
{
get { return fname ; }
set
{
if (fname != value)
{
fname = value;
OnpropertyChanged("Fname");
}
}
}

private string fpath;
public string Fpath
{
get { return fpath; }
set
{
if (fpath != value)
{
fpath = value;
OnpropertyChanged("Fpath");
}
}
}


public Numbers()
{
}

public Numbers(string num, string a,string fn, string fp)

{
Number = num;
Action = a;
Fname = fn;
Fpath = fp;
}

public static Numbers UnknownNumbers
{
get
{
return new Numbers("بدون کلید", "بی نام" , "" , "");
}
}

public event PropertyChangedEventHandler PropertyChanged;

public void OnpropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

}
}

gwbasic
شنبه 16 مهر 1390, 11:49 صبح
برای cmbActionNum که احتمالا ComboBox هست توی InitBinding و البته بالا اون DataSource رو مشخص کنید و بعد DisplayMember رو برای پراپرتی ای که در کمبو باید نمایش داده شود و در صورت لزوم ValueMember برای بازگردادن پراپرتی ای از رکوردی که انتخاب شده
بطور مثال:

cmbActionNum.DataSource = numberBS;
cmbActionNum.DisplayMember = "Name";

shahrzad87
شنبه 16 مهر 1390, 11:51 صبح
به جای کلمه INotifyPropertyChanged توی کلاس Wav نوشتم، userControl روی فرم اومد و درست شد. :-؟؟

gwbasic
شنبه 16 مهر 1390, 11:55 صبح
به هر حال اون نکته ای رو که گفتم رعایت کنید

shahrzad87
شنبه 16 مهر 1390, 12:03 عصر
برای cmbActionNum که احتمالا ComboBox هست توی InitBinding و البته بالا اون DataSource رو مشخص کنید و بعد DisplayMember رو برای پراپرتی ای که در کمبو باید نمایش داده شود و در صورت لزوم ValueMember برای بازگردادن پراپرتی ای از رکوردی که انتخاب شده
بطور مثال:

cmbActionNum.DataSource = numberBS;
cmbActionNum.DisplayMember = "Name";


این کد رو برای ارتباط با دیتابیس گفتین ؟
می شه بیشتر توضیح بدین، منظورتون رو نفهمیدم :|

shahrzad87
شنبه 16 مهر 1390, 12:06 عصر
به comboBox مستقیما از peroperty از Items مقدار دادم.

gwbasic
شنبه 16 مهر 1390, 12:11 عصر
به comboBox مستقیما از peroperty از Items مقدار دادم.
اشتباه محض!!!!!! :عصبانی:
وقتی از Binding استفاده می کنید دیگه نباید همچین کاری بکنید از خصوصیت DataSource برای دادن آیتمها به کمبو استفاده کنید.

shahrzad87
شنبه 16 مهر 1390, 12:26 عصر
اشتباه محض!!!!!! :عصبانی:
وقتی از Binding استفاده می کنید دیگه نباید همچین کاری بکنید از خصوصیت DataSource برای دادن آیتمها به کمبو استفاده کنید.

چرا عصبانی می شین ؟ D:
خب من مبتدی هستم دیگه! منظورتون رو متوجه نشدم! :|

gwbasic
شنبه 16 مهر 1390, 12:43 عصر
دقیقا همون کدی رو که توی پست 7 گفتم رو باید تو InitBinding بنویسید و دیگه نیازی به اضافه کردن ایتمها دونه به دونه به Items نیست

xxxsenatorxxx
پنج شنبه 03 فروردین 1391, 00:22 صبح
سلام
یک تری ویو چک باکس دار چند سطحی داریم می خوام یک شرط بزارم که اگر دکمه رو زدیم و هیچ ندی تیک نخورده بود یک پیغام بده.همین
با تشکر

nefrat
جمعه 08 اردیبهشت 1391, 13:36 عصر
چطوری میتونم پنل سمت چپ ویندوز رو با همین روش پیاده سازی کن م؟

delphi_kavoshkar
چهارشنبه 01 شهریور 1391, 08:59 صبح
سلام
من برنامه دانش آموز و استاد رو دیدم عالی بود.
یه برنامه می خوام پیاده کنم که سطوح دسترسی رو از دیتابیس بخونه و بر اساس مقادیر بولی و Index ها در یک TreeView بصورت درختواره آنها را بصورت CheckBox نمایش بده که بتونم سطوح دسترسی رو حذف و یا اضافه کنم(تیک مربوط به چک باکس ها رو بردارم یا بگذارم)
میشه لطف کنید یک نمونه از نوعی که گفتم بهم معرفی کنید تا از اون الگو بگیرم
متشکرم