PDA

View Full Version : نیاز به کنترل مخصوص



ahmad_hamdi
چهارشنبه 01 آذر 1391, 14:23 عصر
با سلام خدمت دوستان
من به یک کنترل نیاز دارم که مثل checkedlistbox باشه با این تفاوت که فقط ریشه چک باکس داشته باشه و فرزندان به جای چک باکس یه color box کنارشون باشه یعنی کنار فزرندهای یک ریشه به جای چک باکس یه باکس رنگ باشه که اگه روش کلیک کردیم بتونیم با color dialog رنگش و تغییر بدیم
یه چیزی تو مایه های شکل زیر:

http://www.pic1.iran-forum.ir/images/up10/85144890424840496337.jpg


ممنون

ahmad_hamdi
چهارشنبه 01 آذر 1391, 17:17 عصر
دوستان یه عکس بهتر گذاشتم دقیقا یه کنترل مثل این عکس میخوام

http://vena.128pro.net/img/befa505c8e8b.jpg

ahmad_hamdi
پنج شنبه 02 آذر 1391, 09:15 صبح
اساتید عزیز فوری هستش , یه راهنمایی کوچیک هم میتونه خیلی کمک کنه , خیلی شبیه چک لیست باکس هستش فقط فرزندان چک باکس ندارن و جعبه انتخاب رنگ کنارشون هست

AmirGhasemi
پنج شنبه 02 آذر 1391, 09:50 صبح
سلام
بايد از treeview استفاده كني

ahmad_hamdi
پنج شنبه 02 آذر 1391, 10:36 صبح
بله دوست عزیز من در واقع منظورم treeview هستش که اشتباهی گفتم checkedlistbox
توی این treeview چطور میشه چک باکس های فرزندان یک ریشه رو برداشت و به جاش یه باکس رنگ گذاشت که وقتی روش کلیک شد دیالوگ رنگ باز بشه و بشه رنگ باکس اون فرزند عوض بشه ولی ریشه خودش چک باکس داشته باشه نه رنگ باکس , درست مثل شکلی که گذاشتم
با تشکر

ahmad_hamdi
پنج شنبه 02 آذر 1391, 20:53 عصر
فکر کنم باید کنترل treeview و تغییر بدم اما نمیدونم چجوری

plus
پنج شنبه 02 آذر 1391, 21:21 عصر
یک راهش اینه که به Node ها عکس بدی، مشخصه ImageIndex و ImageKey مربوط به Node رو بررسی کن ببین چطوریه.
راهه دیگش اینه که متن هر Node رو دستی رسم کنی.واسه این کار باید مشخصه DrawMode مربوط به TreeView رو OwnerDrawText کنی بعد رویداد DrawNode رو هندل کنی. یه نمونه هندلش که البته کامل نیست و فقط واسه مثال نوشتم اینطوری میشه:


private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
int size = 10;

using (SolidBrush brush = new SolidBrush(Color.Red))
e.Graphics.FillRectangle(brush, new Rectangle(e.Bounds.Left, e.Bounds.Top, size, size));

using (SolidBrush brush = new SolidBrush(treeView1.ForeColor))
e.Graphics.DrawString(e.Node.Text, treeView1.Font, brush, e.Bounds.Left + size, e.Bounds.Top);
}

اگه با روش اولی بتونی این کارو بکنی خیلی بهتره، نوشتن کد روش دوم به صورت کامل سخته.

ahmad_hamdi
جمعه 03 آذر 1391, 15:33 عصر
ممنون دوست عزیز ولی عکس نمیشه حتما باید رنگ باشه و این رنگ ها دائم در حال تغییر هستش

plus
جمعه 03 آذر 1391, 15:37 عصر
ممنون دوست عزیز ولی عکس نمیشه حتما باید رنگ باشه و این رنگ ها دائم در حال تغییر هستش

میتونی عکس مربوط به یک رنگ رو در زمان اجرا درست کنی.این کار به مراتب ساده تر از رسم دستی Node هست...

ahmad_hamdi
جمعه 03 آذر 1391, 15:39 عصر
ممنون دوست عزیز کدت تقریبا کار کرد فقط حالا چجوری باید چک باکس فرزندان و حذف کرد؟ و چطوری به مربع رنگی کد داد؟
تشکر

ahmad_hamdi
جمعه 03 آذر 1391, 15:48 عصر
منم فکر میکنم تبدیل عکس به رنگ بهتر باشه اما چجوری یه عکس و در زمان اجرا ایجاد و اونو به رنگ تبدیل کنیم و ایندکس اونو به نود بدیم؟

plus
جمعه 03 آذر 1391, 16:34 عصر
ممنون دوست عزیز کدت تقریبا کار کرد فقط حالا چجوری باید چک باکس فرزندان و حذف کرد؟ و چطوری به مربع رنگی کد داد؟
تشکر

برای حذف چک باکس های برگ ها:


private void Form_Load(object sender, EventArgs e)
{
foreach (TreeNode node in treeView1.Nodes)
HideCheckBoxOfLeafs(node);
}
private void HideCheckBoxOfLeafs(TreeNode node)
{
if (node.Nodes.Count == 0)
{
HideCheckBox(treeView1, node);
return;
}

foreach (TreeNode childNode in node.Nodes)
{
HideCheckBoxOfLeafs(childNode);
}
}
private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam,
ref TVITEM lParam);

/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}

رنگ هم توی همون متد Draw مشخص میشه که من Red دادم.

plus
جمعه 03 آذر 1391, 16:36 عصر
منم فکر میکنم تبدیل عکس به رنگ بهتر باشه اما چجوری یه عکس و در زمان اجرا ایجاد و اونو به رنگ تبدیل کنیم و ایندکس اونو به نود بدیم؟

باید از کلاس های System.Graphics استفاده کنی، یعنی کلاس های Bitmap و Image و... برای آدرس دهی هم باید عکس رو به مشخصه ImageList.Images مربوط به TreeView اضافه کنی و بعد اندیس بهش بدی.البته من تاحالا کار نکردم با ImageList اما این کار شدنیه.

ahmad_hamdi
شنبه 04 آذر 1391, 20:21 عصر
ممنون چک میکنم