ورود

View Full Version : نحوه بايند كردن ستوني از گريد كه combo هست؟



majid325
یک شنبه 05 آبان 1387, 21:41 عصر
سلام

من يه dataGridView دارم كه يه ستونش(ستون اول) از جنس combo هست ،‌ تونستم مقاديري كه بايد در DisplayMember باشند رو ست كنم ولي نميتونم مقداري كه به عنوانDataPropertyName در combo قرار بگيره رو ست كنم لااقل بادستور هاي زير كه نشد:

dataGridViewXMemRange.Columns[0].DataPropertyName="MemberRange_Name"
و

DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
combo.DataPropertyName = "MemberRange_Name";
dataGridViewXMemRange.Columns.Insert(0, combo);

rostamkhani
یک شنبه 05 آبان 1387, 23:12 عصر
سلام
بنده از متد زیر استفاده میکنم
البته این متد داخل MyDataGridView هست شما اگر بیرون میخوایی استفاده کنی باید دیتا گرید رو بهش ارسال کنی و متد رو تکمیل کنی


public void AddCombo(string ColumnName, string HeaderText, string NameTable, string DisplayColumn, string ValueMember, string SWhere,DataGridViewComboBoxDisplayStyle CmbStyle)
{

int ColumnDisplayIndex = Columns[ColumnName].DisplayIndex;
Columns.Remove(ColumnName);
string sql;
sql = "Select " + ValueMember + " as VL," + DisplayColumn + " as LB from " + NameTable + " " + SWhere;
SqlDataAdapter da_addcombo = new SqlDataAdapter(sql, con);
DataTable dt_addcombo;
dt_addcombo = new System.Data.DataTable();
da_addcombo.Fill(dt_addcombo);
DataGridViewComboBoxColumn column_addcombo = new DataGridViewComboBoxColumn();
column_addcombo.DataSource = dt_addcombo;
column_addcombo.DisplayMember = "LB";
column_addcombo.ValueMember = "VL";
column_addcombo.DataPropertyName = ColumnName;
column_addcombo.Name = ColumnName;
column_addcombo.HeaderText = HeaderText;
column_addcombo.DisplayIndex = ColumnDisplayIndex;
column_addcombo.DisplayStyle = CmbStyle;
Columns.Add(column_addcombo);
}

majid325
یک شنبه 05 آبان 1387, 23:28 عصر
خيلي ممنون ولي همونطور كه در پست اول هم اشاره كردم اين روش رو قبلا استفاده كرده بودم.

majid325
یک شنبه 05 آبان 1387, 23:37 عصر
توي Exception.Message ميگه comboboxCell value is not valid!
در واقع اين خطا از طرف dataGridView هست.

DataSource گريد رو هم به شي BindingSource ربط دادم.

majid325
دوشنبه 06 آبان 1387, 04:23 صبح
اينم نمونه

SMRAH1
دوشنبه 06 آبان 1387, 11:05 صبح
سلام

توی کد ارسالی جدول Tb_Range رو نگذاشتی!

majid325
دوشنبه 06 آبان 1387, 18:20 عصر
سلام

توی کد ارسالی جدول Tb_Range رو نگذاشتی!

از بس كه حولم....

rostamkhani
سه شنبه 07 آبان 1387, 01:07 صبح
سلام
مشکل احتمالا از از نوع فیلد
شما چون [MemberRange_Name از نوع nchar است و Range_id شما از نوع int این مشکل پیش میاد.
به نظر بنده بهتر به جای MemberRange_Name در جدول Tb_MemberRange از MemberRange_id استفاده کنید از نوع int ، مطابق با نوع int فیلد Range_id که برای combo.ValueMember استفاده کردید
=> نوع فیلد combo.DataPropertyName با فیلد combo.ValueMember احتمالا باید برابر باشند .

majid325
سه شنبه 07 آبان 1387, 02:20 صبح
با اينكه منطقي نيست كه نوع فیلد هاي combo.DataPropertyName و combo.ValueMember يكي باشد ، ولي اين كار هم كردم ، جواب نداد .

SMRAH1
سه شنبه 07 آبان 1387, 08:16 صبح
سلام

برنامه رو دیدم.در ابتدا یادآوری دو نکته ضروریست (احتمالا با فراموشی جا انداخته اید و مشکل اصلی در همین جاست):
1) با توجه به اینکه در برنامه دو جدول مرتبط دارید،منطقا می خواهید هر دو جدول را همزمان به کاربر نمایش دهید در حالی که فقط یک DataGridView در فرم گذاشته و هر دو جدول را به DataSource آن تنظیم کرده اید.حتما DGV دوم را هم اضافه کنید.
2) شما اشتباها خاصیت AutoGenerateColumns را به false تنظیم کرده اید در نتیجه در هنگام افزودن DataSource ستونهای مناسب تولید نمی شود.

یادآوری دو نکته دیگر نیز به نظرم مهم آمد (هر چند که به سئوالتان مرتبط نیست ولی برای تجربه دیگر دوستان می نویسم در ضمن ما هم باید اظهار فضل کنیم یا نه:چشمک:!).
1) عرض ستون Combo اضافه شده را به اندازه مناسب تنظیم کنید (واقعیت این است که در اجراهای اول و دوم این ستون را ندیدم و فکر کردم که اصلا چنین ستونی ایجاد نشده است!).
2) با توجه به اینکه ComboBox جانشین ستون MemberRange_Name می شود،بظر می رسد که بهتر باشد که این ستون را نیز حذف کنید یعنی :

dataGridViewX2.Columns.Remove("MemberRange_Name");
dataGridViewX2.Columns.Insert(0, combo);
در ضمن من تست کردم (با توجه به نکات بالا) و کاملا جواب داد.اگر مشکلی هست بگو تا برنامه تست شده خودم رو بفرستم.

موفق باشی

majid325
سه شنبه 07 آبان 1387, 08:35 صبح
سلام

برنامه رو دیدم.در ابتدا یادآوری دو نکته ضروریست (احتمالا با فراموشی جا انداخته اید و مشکل اصلی در همین جاست):
1) با توجه به اینکه در برنامه دو جدول مرتبط دارید،منطقا می خواهید هر دو جدول را همزمان به

خيلي ممنون ولي لزومي نداره كه 2 جدول حتما از طريق ديتا گريد نشان داده شود.



2) شما اشتباها خاصیت AutoGenerateColumns را به false تنظیم کرده اید در نتیجه در هنگام افزودن DataSource ستونهای مناسب تولید نمی شود.



دقيقا منظورم همين بود كه columns هاي كه خودم ميخوام و از طريق ide طراحي كردم رو كاربر ببينه.


در ضمن من تست کردم (با توجه به نکات بالا) و کاملا جواب داد.اگر مشکلی هست بگو تا برنامه تست شده خودم رو بفرستم.

موفق باشی

خيلي ممنون از اين كه وقت گزاشتيد.
چون برنامه حجم زيادي داشت اين نمونه رو به صورت عجله اي درست كردم كه منظورم رو متوجه بشيد.

دقيقا متوجه شديد مشكل از كجا بود؟

SMRAH1
سه شنبه 07 آبان 1387, 09:17 صبح
سلام

برنامه ایرادی جدی نداره و مشکل از عدم پایداری در داده ها است:

1) خالي بودن جدول Tb_Member باعث يک نوع استثنا مي شود(برای این مورد فکری کنید).ولي اين استثنايي که براي شما رخداده است در واقع به خاطر اين است که جدول Tb_MemberRange پر شده ولي داراي داده هماهنگ برای فيلد MemberRange_Name در جدول Tb_Range نيست!

در ضمن منظورتون را از اينکه فرموديد 'لزومي نداره كه 2 جدول حتما از طريق ديتا گريد نشان داده شود.' نفهميدم.به نظر مي رسه که تمام اين همه کد برنامه براي ايجاد رابطه اي در جدول است که کاربر اصلا قادر به کنترل آن نيست؟!
در ضمن ميشد که DGV دوم را هم ساخت فقط نمايش نداد!
در هر حال خيلي برام جالبه منظورتون را براي استفاده اينطوري از جداول بدونم (براي افزايش تجربه خودم مي خواهم).

موفق باشيد

majid325
چهارشنبه 08 آبان 1387, 04:42 صبح
با تشكر




1) خالي بودن جدول Tb_Member باعث يک نوع استثنا مي شود(برای این مورد فکری کنید).ولي اين استثنايي که براي شما رخداده است در واقع به خاطر اين است که جدول Tb_MemberRange پر شده ولي داراي داده هماهنگ برای فيلد MemberRange_Name در جدول Tb_Range نيست!


من تست كردم ولي بازم همون erorr قبلي رو داد!
ميشه برنامه اي كه شما ازش جواب گرفتي رو بزاري اينجا؟


در ضمن منظورتون را از اينکه فرموديد 'لزومي نداره كه 2 جدول حتما از طريق ديتا گريد نشان داده شود.' نفهميدم.به نظر مي رسه که تمام اين همه کد برنامه براي ايجاد رابطه اي در جدول است که کاربر اصلا قادر به کنترل آن نيست؟!


شما كنترل داده رو كه فقط از طريق گريد انجام نميدي، ميتونه نتايج يه جستجو باشه و يا اصلا با كليد هاي "بعدي" و "قبلي" در بين ركوردها حركت كنيد.

فرض كنيد كه با يه جستجو به نتيجه دلخواه رسيديد ، براي نمايش يك رابطه يك به چند با توجه به عكس ضميمه ميتوان داده ها رو نمايش داد.

SMRAH1
چهارشنبه 08 آبان 1387, 11:24 صبح
سلام

اولا برنامه رو به همراه پایگاه داده خودم ضمیمه کردم.تست کردم و روی سیستم من،بدون هیچ مشکلی،جواب می ده (هر دو تا کد).

دوم ،منظورم از این که چرا DataSet رو Bind کرده اید،این بود که با توجه به این موضوع که شما جدول اول رابطه رو نشان نمی دید (جدول دوم با توجه به ارتباطی که با جدول اول داره داده هاش بر اساس انتخاب جدول اول،بار گذاری می شه)،چرا دوباره به همان تنها DGV موجود Bind شده!
همچنین به نظر می رسه در تصویر ارسالی هم جدول اول مورد بحث،به داده های قسمت اطلاعات اشخاص Bind شده (و در Semple فرستاده شده هیچ Bind صورت نگرفته بود) و ارتباط با آن در برنامه جاریست.

موفق باشید

majid325
چهارشنبه 08 آبان 1387, 15:47 عصر
سلام

اولا برنامه رو به همراه پایگاه داده خودم ضمیمه کردم.تست کردم و روی سیستم من،بدون هیچ مشکلی،جواب می ده (هر دو تا کد).

موفق باشید
سلام
دستت دردنكنه از اينكه وقت گزاشتيد .


دوم ،منظورم از این که چرا DataSet رو Bind کرده اید،این بود که با توجه به این موضوع که شما جدول اول رابطه رو نشان نمی دید (جدول دوم با توجه به ارتباطی که با جدول اول داره داده هاش بر اساس انتخاب جدول اول،بار گذاری می شه)،چرا دوباره به همان تنها DGV موجود Bind شده!
همچنین به نظر می رسه در تصویر ارسالی هم جدول اول مورد بحث،به داده های قسمت اطلاعات اشخاص Bind شده (و در Semple فرستاده شده هیچ Bind صورت نگرفته بود) و ارتباط با آن در برنامه جاریست.

يا من منظور شما رو خوب متوجه نميشم يا شما داري قضيه رو واسه خودت سخت ميكني!
اين جور كه من از توضيحات شما برداشت كردم مشكل بايند شدن جداول هست كه با اين كد جدول اول:

this.textBox1.DataBindings.Add("Text", bsMem, "Member_Name");
this.textBox2.DataBindings.Add("Text", bsMem, "Member_Family");
و جدول دوم با اين كد :

dataGridViewX1.DataSource = bsMemRange;
و با كد زير يك ارتباط بين اين 2 برقرار كردم:

drl = new DataRelation("MemAndRange", dsMem.Tables["Tb_Member"].Columns["Member_Code"], dsMem.Tables["Tb_MemberRange"].Columns["MemberRange_MemberCode"]);
dsMem.Relations.Add(drl);

bsMem = new BindingSource(dsMem, "Tb_Member");
bsMemRange = new BindingSource(bsMem, "MemAndRange");

حالا شايد كار من غير منطقي هست و خودم خبر ندارم ، ميشه بگين شما در اين جور مسائل چطوري برخورد ميكنيد؟

در كل با راهنمايي شما كارم راه افتاد.