PDA

View Full Version : نمایش 2 ستون در ComboBox



salargham
سه شنبه 15 اسفند 1391, 19:54 عصر
با سلام
چطور میتونم بجای قرار دادن 1 ستون از جدول بانک،2 ستون از آن رو در یک کامبو باکس نمایش بدم.و همچنین وقتی که یک سطر انتخاب شد وقتی که در بانک ذخیره کردیم.کد آن ذخیره شود.


http://uploadtak.com/images/m3222_untitled.bmp

veniz2008
سه شنبه 15 اسفند 1391, 20:12 عصر
سلام.
در دستور sql ای که مینویسید اون دو فیلد رو با هم جمع بزنید.

select FirstName + ' ' + LastName from TblPerson
حالا راحت میتونید همزمان نام و نام خانوادگی رو درون کمبو نمایش بدید.
موفق باشید.

salargham
چهارشنبه 16 اسفند 1391, 18:56 عصر
ممنونم
ولی به این صورت نمی خوام باشه.دقیقا مثل تصویر بالا باشه.

veniz2008
چهارشنبه 16 اسفند 1391, 20:46 عصر
فکر نمیکنم چیزی که شما میخوای رو بشه با یک کمبو پیاده سازی کرد. معمولا متن رو نمایش میدن (displaymember) و کد رو در پشت پرده (valuemember ) نگه میدارن. موقع ذخیره هم،ارزش هر آیتم انتخاب شده (همون کد قسمت) رو با گزینه selectedvalue بدست میارن.

bsflasher
چهارشنبه 16 اسفند 1391, 22:33 عصر
خیلی راحت
از کامپوننت های جانوس استفاده کن
گرید را بنداز تو کمبو

salargham
پنج شنبه 17 اسفند 1391, 13:11 عصر
ممنونم
میشه یه نمونه سورس بذارید

khokhan
پنج شنبه 17 اسفند 1391, 13:27 عصر
درود بر شما

این نمونه که می گذارم دقیقا چیزیه که شما می خواین :لبخند:
از هیچ کامپوننتی هم استفاده نشده

اگه خوشتون اومد سلامتی همه دوستان لبخد بزنید :لبخند:

salargham
پنج شنبه 17 اسفند 1391, 21:18 عصر
تشکر
ولی برای String ها چرا جواب نمیده

rasoul babadi
یک شنبه 13 مهر 1393, 08:48 صبح
سلام به دوستان عزیز منم این مشکل رو دارم
من دارم یه برنامه می نویسم البته با استفاده از Stored Procedures های sql server 2005
لطفا اگر امکان داره دقیقا من فقط می خوام کمبو باکس متن نام و نام خانوادگی رو نمایش بده و کد او رکورد رو هم دخیره کنه البته کد زیر رو نوشتم ولی فقط نام خانوادگی رو نشون می ده.
به تصویر زیر نگاه کن

124213
{
// Baray por kardan combo box as jadval person
SqlDataAdapter da = newSqlDataAdapter("SelectAllperson", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable dt = newDataTable();
da.Fill(dt);
cmbPerson.DataSource = dt;
cmbPerson.DisplayMember = "LastName" ;
cmbPerson.ValueMember = "id";
FillGrid();
}

plus
یک شنبه 13 مهر 1393, 16:38 عصر
یا باید از کامپوننت های آماده استفاده کنید، یا از رویداد Format (برای نمایش متن دلخواه در هر آیتم) یا از رویداد DrawItem (برای رسم تصویر دلخواه به ازای هر آیتم.
برای روش آخر یکی نمونه قبلا گذاشته بودم جستجو کنید.
124249

mohammad5530
یک شنبه 13 مهر 1393, 22:42 عصر
از کامپوننت استفاده کنید . به هر شکلی که بخاید میتونید تغییر بدید

rasoul babadi
جمعه 18 مهر 1393, 15:05 عصر
متوجه نشدم میشه برام توضیح بدید البته اگر امکان داشته باشه. آخه من فایل های پیوسته که در پست های بالایی بود گرفتم اما درست نشد.
اطلاعات افرادی که در بانک کارمند ذخیره کردخ کدش درست عمل می کنه و نام خانوادگی رو توی کمبو باکس نمایش میده اما اگر توی جدول من چند نام خانوادگی مشترک داشته باشم در انتخاب کارمند مورد نظرم به مشکل بر می خورم برای همین می خواستم که نام و نام خانوادگی کارمند در کمبو باکس مشخص باشه.

khokhan
جمعه 18 مهر 1393, 17:54 عصر
متوجه نشدم میشه برام توضیح بدید البته اگر امکان داشته باشه. آخه من فایل های پیوسته که در پست های بالایی بود گرفتم اما درست نشد.
اطلاعات افرادی که در بانک کارمند ذخیره کردخ کدش درست عمل می کنه و نام خانوادگی رو توی کمبو باکس نمایش میده اما اگر توی جدول من چند نام خانوادگی مشترک داشته باشم در انتخاب کارمند مورد نظرم به مشکل بر می خورم برای همین می خواستم که نام و نام خانوادگی کارمند در کمبو باکس مشخص باشه.

124417



عزیز !!! کاری نداره یه کمبو باکس سفارشی درون یه کلاس درست کن به شرح ذیل .... بعد مثل همه کمبو باکس ها پرش کن :



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Globalization;
using System.Drawing;

namespace Dr_bodagi2
{
public class WishWish : ComboBox
{
public WishWish()
{
DrawMode = DrawMode.OwnerDrawVariable;
}

public new DrawMode DrawMode
{
get
{
return base.DrawMode;
}
set
{
if (value != DrawMode.OwnerDrawVariable)
{
throw new NotSupportedException("نیاز به ساختار اختصاصی می باشد ");
}
base.DrawMode = value;
}
}

public new ComboBoxStyle DropDownStyle
{
get
{
return base.DropDownStyle;
}
set
{
if (value == ComboBoxStyle.Simple)
{
throw new NotSupportedException("این شیوه پشتیبانی نمی شود");
}
base.DropDownStyle = value;
}
}

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

InitializeColumns();
}

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

InitializeValueMemberColumn();
}

protected override void OnDropDown(EventArgs e)
{
base.OnDropDown(e);
this.DropDownWidth = (int)CalculateTotalWidth();
}

const int columnPadding = 5;
private float[] columnWidths = new float[0];
private String[] columnNames = new String[0];
private int valueMemberColumnIndex = 0;

private void InitializeColumns()
{
PropertyDescriptorCollection propertyDescriptorCollection = DataManager.GetItemProperties();

columnWidths = new float[propertyDescriptorCollection.Count];
columnNames = new String[propertyDescriptorCollection.Count];

for (int colIndex = 0; colIndex < propertyDescriptorCollection.Count; colIndex++)
{
String name = propertyDescriptorCollection[colIndex].Name;
columnNames[colIndex] = name;
}
}

private void InitializeValueMemberColumn()
{
int colIndex = 0;
foreach (String columnName in columnNames)
{
if (String.Compare(columnName, ValueMember, true, CultureInfo.CurrentUICulture) == 0)
{
valueMemberColumnIndex = colIndex;
break;
}
colIndex++;
}
}

private float CalculateTotalWidth()
{
float totWidth = 0;
foreach (int width in columnWidths)
{
totWidth += (width + columnPadding);
}
return totWidth + SystemInformation.VerticalScrollBarWidth;
}

protected override void OnMeasureItem(MeasureItemEventArgs e)
{
base.OnMeasureItem(e);

if (DesignMode)
return;

for (int colIndex = 0; colIndex < columnNames.Length; colIndex++)
{
string item = Convert.ToString(FilterItemOnProperty(Items[e.Index], columnNames[colIndex]));
SizeF sizeF = e.Graphics.MeasureString(item, Font);
columnWidths[colIndex] = Math.Max(columnWidths[colIndex], sizeF.Width);
}

float totWidth = CalculateTotalWidth();

e.ItemWidth = (int)totWidth;
}

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);

if (DesignMode)
return;

e.DrawBackground();

Rectangle boundsRect = e.Bounds;
int lastRight = 0;


//Shakir
//using (Pen linePen = new Pen(SystemColors.GrayText))
using (Pen linePen = new Pen(Color.Black))
{
using (SolidBrush brush = new SolidBrush(e.ForeColor))
//using (SolidBrush brush = new SolidBrush(BackColor))
{
if (columnNames.Length == 0 && e.Index >= 0)
{
e.Graphics.DrawString(Convert.ToString(Items[e.Index]), Font, brush, boundsRect);
}
else
{
for (int colIndex = 0; colIndex < columnNames.Length; colIndex++)
{
string item = Convert.ToString(FilterItemOnProperty(Items[e.Index], columnNames[colIndex]));

boundsRect.X = lastRight;
boundsRect.Width = (int)columnWidths[colIndex] + columnPadding;
lastRight = boundsRect.Right;

if (colIndex == valueMemberColumnIndex)
{
using (Font boldFont = new Font(Font, FontStyle.Bold))
{
e.Graphics.DrawString(item, boldFont, brush, boundsRect);
}
}
else
{
e.Graphics.DrawString(item, Font, brush, boundsRect);
}

if (colIndex < columnNames.Length - 1)
{
e.Graphics.DrawLine(linePen, boundsRect.Right, boundsRect.Top, boundsRect.Right, boundsRect.Bottom);
}
}
}
}
}

e.DrawFocusRectangle();

}
}

}




این هم اختصاص دیتا تیبل :


private void Form1_Load(object sender, EventArgs e)
{

DataTable dtTest = new DataTable();
dtTest.Columns.Add("ID", typeof(int));
dtTest.Columns.Add("Name", typeof(string));
dtTest.Columns.Add("L-Name", typeof(string));

dtTest.Rows.Add(1, "فروغ ", "تهمتن زاده اصل تهرانی فر");
dtTest.Rows.Add(2, "امیر ارسلان ", "نامدار");
dtTest.Rows.Add(3, "بیژن ", "منیژهخواه اکبرآبادی ");
dtTest.Rows.Add(4, "افشین ", "صبوحی پرور شترخواه");
dtTest.Rows.Add(5, "ناهید", "سمندرپورقلندر افکن");


wishWish1.DataSource = dtTest;
wishWish1.DisplayMember = "Name";
wishWish1.ValueMember = "ID";

}

دلتنگ اسمان
شنبه 19 مهر 1393, 05:15 صبح
با سلام
من کدهای مهندس khokhan رو کپی کردم و اجرا کردم ولی خطا میده میشه لطفا دلیل خطا رو بگید. ظاهرا به رفرنس خطا میده:
124433

khokhan
شنبه 19 مهر 1393, 14:34 عصر
خطا میده میشه لطفا دلیل خطا رو بگید. ظاهرا به رفرنس خطا میده::متفکر:
شاید .....................:لبخند:

rasoul babadi
شنبه 19 مهر 1393, 16:42 عصر
سلام دوست عزیز
خوب این طور که من متوجه شدم باید اول اون کد بالایی رو بنویسم و یک کمبوباکس بسازم *** بعد اطلاعاتم از بانک اسکیوال فراخوانی کنم ***. من اطلاعاتم رو به صورت زیر فراخوانی کردم هر چند که قبلا کدش رو گذاشتم . کجای این کد باید دو ستون رو فراخوانی کنم آخه شما تو کد اختصاص دیتا تیبل خودتون جدول رو پر کردین اما من می خوام خودش اتوماتیک پر بشه زمانی که اطلاعات کارمند رو در فرم دیگری ثبت می کنم نام و نام خانوادگیش توی این کمبو نمایش داده بشه.
نمیشه با دستور اسکیو ال یه select بزنم با and دوتا ستون رو فراخوانی کنم.

124449

دلتنگ اسمان
شنبه 19 مهر 1393, 16:45 عصر
جناب khokhan ممنون از پاسختون.
اول اینکه توی رفرنسها Microsoft.Csharp برای من علامت تعجب داره. یعنی مشکل داره. این dll رو از کجا میشه دانلود کرد؟
و دیگه اینکه نام کلاس شما WishWish هستش ولی در لود فرم WishWish1 استفاده شده بدون نمونه سازی! . برام جالبه که بدونم این WishWish1 از کجا اومده؟
سیستم من vs2008 هستش.

rasoul babadi
شنبه 19 مهر 1393, 17:01 عصر
سلام دادش راست میگه من این کد توی برنامم کپی کردم همش بهم خورد اکثرا دستورات رو ازشون خطا می گرفت من این ویش ویش شما رو کجا باید بزارم
این کارو کردم از آدرس زیر یه کمپانت کلاس ساختم کدرو اونجا کپی کردم اما....
add new item - Componet Class

khokhan
شنبه 19 مهر 1393, 17:15 عصر
سلام دادش راست میگه من این کد توی برنامم کپی کردم همش بهم خورد اکثرا دستورات رو ازشون خطا می گرفت من این ویش ویش شما رو کجا باید بزارم
این کارو کردم از آدرس زیر یه کمپانت کلاس ساختم کدرو اونجا کپی کردم اما....
add new item - Componet Class

قابل توچه مدیران محترم ...خیلی سعی کردم نمونه آپلود نکنم :لبخند: می بینین که نمی شه ...... بعدا شاکی نشین ....

دوست خوبم rasoul babadi یعد از اینکه کلاس کمبو باکس سفارشی رو ایجاد کردی یه بار پرو ژه رو rebuild solution کنین
خواهید دید که یه کامپوننت به نام wishwish توی تول باکس (اولین گزینه ) ایجاد می شه
از گوشش بگیر بنداز توی فرم

اختصاص دیتا تیبل هم که دیگه فرقی نداره که از طریق کد نویسی ایجاد شده باشه یا از بانک فراخوانی شده باشه


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public DataTable GetDataTable()
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Bodagi.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
conn.Open();
string query = "SELECT * FROM zirna ";

SqlCommand cmd = new SqlCommand(query, conn);

DataTable t1 = new DataTable();
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
{
a.Fill(t1);
}
return t1;
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = GetDataTable();
wishWish1.DataSource = dt;
wishWish1.DisplayMember = "f_name";
wishWish1.ValueMember = "ID";
}

babahooman
سه شنبه 18 آذر 1393, 03:05 صبح
قابل توچه مدیران محترم ...خیلی سعی کردم نمونه آپلود نکنم :لبخند: می بینین که نمی شه ...... بعدا شاکی نشین ....

دوست خوبم rasoul babadi یعد از اینکه کلاس کمبو باکس سفارشی رو ایجاد کردی یه بار پرو ژه رو rebuild solution کنین
خواهید دید که یه کامپوننت به نام wishwish توی تول باکس (اولین گزینه ) ایجاد می شه
از گوشش بگیر بنداز توی فرم

اختصاص دیتا تیبل هم که دیگه فرقی نداره که از طریق کد نویسی ایجاد شده باشه یا از بانک فراخوانی شده باشه


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public DataTable GetDataTable()
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Bodagi.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
conn.Open();
string query = "SELECT * FROM zirna ";

SqlCommand cmd = new SqlCommand(query, conn);

DataTable t1 = new DataTable();
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
{
a.Fill(t1);
}
return t1;
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = GetDataTable();
wishWish1.DataSource = dt;
wishWish1.DisplayMember = "f_name";
wishWish1.ValueMember = "ID";
}
اینو میشه dllشو بذاری؟

prans_tork
شنبه 23 خرداد 1394, 15:14 عصر
به نظر من بهترین راه اینه که به جای combobox یک Textbox بزارید که موقع کلید داخل اون یک gridview درست از ریزش نمایش داره بشه که با leave شدن موس از روی گرید، گرید دوباره محو بشه
هم شکلش میشه دقیقا مثل کمبوباکس چندستونه و هم کنترل بسیار زیادی روش داری و میتونی هرکاری باهاش بگنی
اگه به نظرت جالب بود میتونم بیشتر توضیح بدم و کد بزارم برات
موفق باشی