PDA

View Full Version : حرفه ای: ساختن ComboBox ای که ستونهای مختلفی داشته باشد



EBRAHIMIEKOKDARAGHI
پنج شنبه 31 مرداد 1392, 12:37 عصر
با سلام خدمت اساتید مجترم
من میخواستم بدونم که آیا مشه کمبو باکسی را با class library ساخت که دارای columns های مختلفی باشد ؟
من قبلا" میخواستم از کامپوننت های دیگری استفاده کنم که قالبا" در استفاده از برنامه هام به مشکل خوردم و به همبن علت میخوام با کمک شما چیزی تهیه کنم که بدرد همه بخورد و این کامپوننت هم سبک باشد و هم بتوان از آن راحت استفاده کرد لطفا" من رو راهنمائی کنبد

mousa1992
پنج شنبه 31 مرداد 1392, 15:23 عصر
multi column comboBox (http://www.codeproject.com/Articles/19781/A-data-bound-multi-column-combobox)
multi column comboBox (http://www.codeproject.com/Articles/3206/Multi-Column-ComboBox)
dev component multi column comboBox (http://www.devcomponents.com/dotnetbar/MultiColumnComboBoxControl.aspx)

plus
پنج شنبه 31 مرداد 1392, 15:27 عصر
مشخصه DataSource کنترل ComboBox میتونه هر Object ی باشه، مثلا DataTable.رویداد DrawItem مربوط به ComboBox هم امکان رسم دستی (در صورتی که مشخصه DrawMode تنظیم شده باشه) هر آیتم رو میده.
طراحی کردن چیزی که میخواین میتونه امکان پذیر باشه اما ساده نیست.من یک نمونه ساده و غیر کامل رو نوشتم تا راه کلی رو رسونده باشم، بقیه اش با خودتون.

باید یک کلاس از کلاس ComboBox مشتق کنید و اونجا DataSource رو بررسی کنید که -در حالت ساده- مثلا اگه DataTable بود، موقع رسم داده های سطر مورد نظر، از DataTable خونده بشن و کنار هم رسم بشن:

class CustomComboBox : System.Windows.Forms.ComboBox
{
protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
{
if (e.Index >= 0 && this.DataSource is DataTable)
{
DataTable dataTable = (DataTable)this.DataSource;
if (e.Index < dataTable.Rows.Count)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
object value = dataTable.Rows[e.Index][i];
if (value != null && value != DBNull.Value)
{
using (SolidBrush brush = new SolidBrush(this.ForeColor))
{
e.Graphics.DrawString(value.ToString(), this.Font, brush, i * 50, e.Index * this.ItemHeight);
}
}
}
}
}
else
{
base.OnDrawItem(e);
}
}

protected override void OnDataSourceChanged(EventArgs e)
{
base.OnDataSourceChanged(e);

if (this.DataSource is DataTable)
{
this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
}
else
{
this.DrawMode = System.Windows.Forms.DrawMode.Normal;
}
}
}

توی فرم، در قسمت طراحی یک دکمه CustomComboBox میگذارید و :

public partial class Form1 : Form
{
DataTable dataTable;
public Form1()
{
InitializeComponent();

dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Value", typeof(string));

dataTable.Rows.Add(10, "Ali");
dataTable.Rows.Add(11, "Reza");
}

private void Form1_Load(object sender, EventArgs e)
{
customComboBox1.DataSource = dataTable;
customComboBox1.DisplayMember = "Value";
customComboBox1.ValueMember = "Id";

}
}

110060109550