PDA

View Full Version : مبتدی: ایجاد ستونی از نوع ComboBox در datagridview و نمایش مقدار ذخیره شده در دیتابیس در این کمبوباکس



محمد علی کارگر
سه شنبه 29 فروردین 1396, 10:29 صبح
با سلام و خسته نباشید خدمت دوستان واساتید.
بنده دو عدد فرم دارم 1- فرم ثبت اطلاعات 2- ویرایش اطلاعات
در هر فرم یک عدد دیتا گرید ویو دارم که دارای دو ستون می باشند ستون اول از نوع کمبو باکس وستون دوم از نوع تکست باکس .
ستون اول که از نوع کمبو باکس هست به جدول مواد اولیه در دیتابیس از طریق کد نویسی متصل می باشد .در فرم اول با انتخاب مواد اولیه ومقدار مصرف آنها در ستون دوم با زدن دکمه ثبت این مواد در جدول مصرف مواد اولیه ثبت می گردد. .الان مشکلی که برایم پیش آمده وقتی که فرم ویرایش را فراخوانی می کنم ستونهایش به صورت تکست باکس لود می شود ولی در صورتی که من لازم دارم به صورت کمبو باکس لود بشه .یعنی بتونم در فرم ویرایش مثلا جای ذرت با گندم را تغییر بدم و....
دوستان ممنون میشم راهنماییم کنید.

AmiN0012
چهارشنبه 30 فروردین 1396, 08:41 صبح
سلام دوست عزیز.
خاصیت columnType ستون مورد نظر را از TextBox به ComboBox تغییر داده.

محمد علی کارگر
چهارشنبه 30 فروردین 1396, 08:41 صبح
کسی نمیتونه کمکم کنه واقعا اینقدر سخته!!!!

محمد علی کارگر
چهارشنبه 30 فروردین 1396, 08:45 صبح
سلام دوست عزیز.
خاصیت columnType ستون مورد نظر را از TextBox به ComboBox تغییر داده.
سلام دوست عزیز من با کد نویسی کمبو باکس تو گرید ویو ایجاد کردم .در فرم ویرایشم به صورت کمبو باکس بالا نمیاد یعنی بلد نیستم که انجام بدم

یونس ابراهیمی
چهارشنبه 30 فروردین 1396, 11:56 صبح
میشه یه عکس بذارین

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 09:21 صبح
میشه یه عکس بذارین


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

mmbguide
جمعه 01 اردیبهشت 1396, 11:05 صبح
باید کدهای ذخیره سازی رو ببینم. به گمانم شما مقدار کلید جدول اول رو در جدول دوم ذخیره نمیکنید بلکه عنوان مواد رو دارید ذخیره میکنید. خب حالا فرض کنیم که شما Value مربوط به جدول اول رو در جدول دوم دارید ذخیره میکنید. حالا برای اینکه در DGV دوم شما بتونید بصورت ComboBox به ستون ماده دسترسی داشته باشید باید از DGV دوم ستون مقادیر ماده را مخفی کنید و یک ستون جدید از نوع DataGridViewComboboxColumn ایجاد کنید تا بتونید بصورت Combo با ستون مورد نظر کار کنید. حالا شما میتونید در فرم دوم و در زمان Load شدن فرم از کدهایی مشابه کدهای زیر استفاده کنید:

DataGridViewComboBoxColumn colMaterial = new DataGridViewComboBoxColumn();
colMaterial.DataPropertyName = "Table2MaterialID";
colMaterial.DataSource = bsMaterial;
colMaterial.DisplayMember = "Table1MaterialName";
colMaterial.ValueMember = "Table1MaterialID";
colMaterial.DisplayIndex = 0;
DGV.Columns.Add(colMaterial);

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 13:45 عصر
SqlCommand cmd = new SqlCommand("select row, amount from RECIPTION where code ='" + textBox1.Text + "'", Form1.conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
Form1.conn.Open();
da.Fill(dt);
Form1.conn.Close();
dataGridView1.DataSource = dt;
این کد لود شدن فرم ویرایش من هست .من مبتدی هستم اگه بیشتر توضیح بدین ممنون میشم

mmbguide
جمعه 01 اردیبهشت 1396, 15:25 عصر
اگر کد ذخیره سازی رو هم بذاری ممنون میشم. میخوام بدونم چه داده هایی رو از فرم اول در جدول دوم ذخیره میکنی.

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 15:29 عصر
اگر کد ذخیره سازی رو هم بذاری ممنون میشم. میخوام بدونم چه داده هایی رو از فرم اول در جدول دوم ذخیره میکنی.


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

mmbguide
جمعه 01 اردیبهشت 1396, 15:40 عصر
اول سعی کن انجام بدی اگر نشد نمونه کد می نویسم.


ابتدا اینکه طراحی باک اطلاعاتی شما با توجه به خواسته شما ایراد داره ولی جدول ROW_Material شما کاملا درسته.
دوم اینکه در جدول Reception فیلدی که باید مواد رو ذخیره کنه از نوع رشته هستش و با توجه به اینکه Primary Key مربوط به ماده از نوه عدد هست پس باید این ستون هم از نوع int باشد و در زمان ذخیره کردن نوع ماده در جدول دوم شما نیاز به اسم ماده ندارید بلکه باید شماره اون ماده رو وارد کنید (همون فیلدی که در جدول مواد علامت کلید دارد). (مباحث مربوط به طراحی بانک اطلاعاتی)
حالا در زمان ثبت اطلاعات در جدول Reception باید بجای اسم ماده، کلید اون ماده رو ذخیره کنی.

اول این مرحله رو انجام بده اگر انجام شد (نمونه فایل رو هم قرار بده) میریم مرحله بعد...

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 15:57 عصر
اول سعی کن انجام بدی اگر نشد نمونه کد می نویسم.


ابتدا اینکه طراحی باک اطلاعاتی شما با توجه به خواسته شما ایراد داره ولی جدول ROW_Material شما کاملا درسته.
دوم اینکه در جدول Reception فیلدی که باید مواد رو ذخیره کنه از نوع رشته هستش و با توجه به اینکه Primary Key مربوط به ماده از نوه عدد هست پس باید این ستون هم از نوع int باشد و در زمان ذخیره کردن نوع ماده در جدول دوم شما نیاز به اسم ماده ندارید بلکه باید شماره اون ماده رو وارد کنید (همون فیلدی که در جدول مواد علامت کلید دارد). (مباحث مربوط به طراحی بانک اطلاعاتی)
حالا در زمان ثبت اطلاعات در جدول Reception باید بجای اسم ماده، کلید اون ماده رو ذخیره کنی.

اول این مرحله رو انجام بده اگر انجام شد (نمونه فایل رو هم قرار بده) میریم مرحله بعد...

این کار رو انجام دادم الان توی ستون اول کمبو باکس من عدد لود میشه من از کجا بدونم که چی هست مثلا یک ذرت هست و...

mmbguide
جمعه 01 اردیبهشت 1396, 19:24 عصر
خب کدهای بالا رو که نوشتم در ادامه همون کدهایی که خودت نوشتی اضافه کن. یک ستون به DGV اضافه میشه و میتونی عنوان رو با مقدارش چک کنی و در انتها ستون عدد رو مخفی کنی. البته پارامترهای کدها بالا رو بررسی کن کاملا مشخصه چی نوشتم.

فقط اونجا که نوشتم bsMaterial: این متغیر از نوه BindingSource هستش که میتونی ویژگی DataSource این شیء رو برابر DataTable جدول اول قرار بدی. همون کدهایی رو که در load نوشتی رو یکبار دیگه در ادامه بنویس ولی اینبار قرار نیست در DGV نمایش بدی بلکه پس از Fill کردن باید DataTable رو به Binding Source اختصاص بدی و پس از اون کدها من رو اضافه کن.

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 22:16 عصر
خب کدهای بالا رو که نوشتم در ادامه همون کدهایی که خودت نوشتی اضافه کن. یک ستون به DGV اضافه میشه و میتونی عنوان رو با مقدارش چک کنی و در انتها ستون عدد رو مخفی کنی. البته پارامترهای کدها بالا رو بررسی کن کاملا مشخصه چی نوشتم.

فقط اونجا که نوشتم bsMaterial: این متغیر از نوه BindingSource هستش که میتونی ویژگی DataSource این شیء رو برابر DataTable جدول اول قرار بدی. همون کدهایی رو که در load نوشتی رو یکبار دیگه در ادامه بنویس ولی اینبار قرار نیست در DGV نمایش بدی بلکه پس از Fill کردن باید DataTable رو به Binding Source اختصاص بدی و پس از اون کدها من رو اضافه کن.







SqlCommand cmd = new SqlCommand("select row, amount from RECIPTION where code ='" + textBox1.Text + "'", Form1.conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
Form1.conn.Open();
da.Fill(dt);
Form1.conn.Close();


dataGridView1.DataSource = dt;
DataGridViewComboBoxColumn colMaterial = new DataGridViewComboBoxColumn();


colMaterial.DataPropertyName = "ROW";
colMaterial.DataSource = dt ;
colMaterial.DisplayMember = "ROW";
colMaterial.ValueMember = "";
colMaterial.DisplayIndex = 0;
dataGridView1.Columns.Add(colMaterial);

dataGridView1.Columns["ROW"].Visible = false;








با این کد ها تقریبا درست شد اما یه مشکل دیگه ای که داره اینه که فقط مواد اولیه ای که درون اون دیتا باشه قابل تغییر هست یعنی ماده جدیدی بهش نمیتونی اضافه کنی .مثلا اگر من در این دیتا گرید ویو سه ماده اولیه داشته باشم فقط بین همین سه ماده میتونم جابجا کنم با ماده اولیه دیگه ای نمیتونی جابجا کنی

mmbguide
جمعه 01 اردیبهشت 1396, 22:25 عصر
شما باید یک DataTable دیگه ای تعریف کنید. مطابق آنچه که در ابتدا انجام دادید. خب این یعنی اینکه دستور SQL شما باید برای DataTable جدید مجددا نوشته بشه و داده ها رو از جدول مواد بگیره. دقیقا شما دو سری دستور مشابه هم دارید که فقط دستورات SQL یکی مربوط به جدول Reception هست که باید داده های اون در DGV نمایش داده بشه و دستور SQL دوم باید داده های جدول Material رو برداره. البته تا 90 درصد به هدف نزدیک شدی یکم دیگه تلاش کن نتیجه میگیری.

محمد علی کارگر
جمعه 01 اردیبهشت 1396, 22:45 عصر
شما باید یک DataTable دیگه ای تعریف کنید. مطابق آنچه که در ابتدا انجام دادید. خب این یعنی اینکه دستور SQL شما باید برای DataTable جدید مجددا نوشته بشه و داده ها رو از جدول مواد بگیره. دقیقا شما دو سری دستور مشابه هم دارید که فقط دستورات SQL یکی مربوط به جدول Reception هست که باید داده های اون در DGV نمایش داده بشه و دستور SQL دوم باید داده های جدول Material رو برداره. البته تا 90 درصد به هدف نزدیک شدی یکم دیگه تلاش کن نتیجه میگیری.





SqlCommand cmd = new SqlCommand("select row, amount from RECIPTION where code ='" + textBox1.Text + "'", Form1.conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();


SqlCommand GMD = new SqlCommand("select ROWS from ROW_MATRIAL", Form1.conn);
SqlDataAdapter FG = new SqlDataAdapter(GMD);
DataTable VB = new DataTable();


Form1.conn.Open();
da.Fill(dt);
FG.Fill(VB);
Form1.conn.Close();


dataGridView1.DataSource = dt;
DataGridViewComboBoxColumn colMaterial = new DataGridViewComboBoxColumn();


colMaterial.DataPropertyName = "ROW";


colMaterial.DataSource = new BindingSource(VB, null);
;
colMaterial.DisplayMember = "ROWS";
colMaterial.ValueMember = "";
colMaterial.DisplayIndex = 0;
dataGridView1.Columns.Add(colMaterial);

dataGridView1.Columns["ROW"].Visible = false;



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

mmbguide
جمعه 01 اردیبهشت 1396, 23:56 عصر
این خطا مربوط به عددی هستش که تو جدول Reception وارد شده. احتمالا اون عدد در جدول اصلی Material وجود ندارد. شما بین جداول ارتباط (Relation) ایجاد کردید؟

محمد علی کارگر
شنبه 02 اردیبهشت 1396, 17:39 عصر
این خطا مربوط به عددی هستش که تو جدول Reception وارد شده. احتمالا اون عدد در جدول اصلی Material وجود ندارد. شما بین جداول ارتباط (Relation) ایجاد کردید؟

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

mmbguide
شنبه 02 اردیبهشت 1396, 17:59 عصر
مجددا سورس جدید رو برام بفرست تا اصلاحش کنم

محمد علی کارگر
شنبه 02 اردیبهشت 1396, 18:16 عصر
مجددا سورس جدید رو برام بفرست تا اصلاحش کنم


باشه چشم. فرستادم

mmbguide
شنبه 02 اردیبهشت 1396, 18:35 عصر
تنها در دو خط اشکال داشت که بهت میگم و مشکل حل میشه:




با توجه به اینکه شما به دو ستون از جدول مواد نیاز دارید (ID, ROW) ولی در دستور SQL فقط ستون ROW درخواست شده بود که من اون رو به * تغییر دادم و شما میتونید فقط ستون ID و ROW را دریافت کنید.
اون خطی که شما ValueMember مربوط به جدول مواد رو نوشتید، مقدارش باید نام ستون ID باشد که شما اون رو خالی گذاشته بودید.


حالا هم دستور SQL رو اصلاح کن و هم مقدار ValueMember رو برابر "ID" قرار بده.

پایان

SqlCommand cmd = new SqlCommand("select row, amount from RECIPTION where code ='" + textBox1.Text + "'", Form1.conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();


SqlCommand GMD = new SqlCommand("select * from ROW_MATRIAL", Form1.conn);
SqlDataAdapter FG = new SqlDataAdapter(GMD);
DataTable VB = new DataTable();


Form1.conn.Open();
da.Fill(dt);
FG.Fill(VB);
Form1.conn.Close();


dataGridView1.DataSource = dt;


DataGridViewComboBoxColumn colMaterial = new DataGridViewComboBoxColumn();
colMaterial.DataPropertyName = "ROW";
colMaterial.DataSource = new BindingSource(VB, null);
colMaterial.DisplayMember = "ROWS";
colMaterial.ValueMember = "ID";
colMaterial.DisplayIndex = 0;
dataGridView1.Columns.Add(colMaterial);

محمد علی کارگر
شنبه 02 اردیبهشت 1396, 18:45 عصر
تنها در دو خط اشکال داشت که بهت میگم و مشکل حل میشه:




با توجه به اینکه شما به دو ستون از جدول مواد نیاز دارید (ID, ROW) ولی در دستور SQL فقط ستون ROW درخواست شده بود که من اون رو به * تغییر دادم و شما میتونید فقط ستون ID و ROW را دریافت کنید.
اون خطی که شما ValueMember مربوط به جدول مواد رو نوشتید، مقدارش باید نام ستون ID باشد که شما اون رو خالی گذاشته بودید.


حالا هم دستور SQL رو اصلاح کن و هم مقدار ValueMember رو برابر "ID" قرار بده.

پایان

SqlCommand cmd = new SqlCommand("select row, amount from RECIPTION where code ='" + textBox1.Text + "'", Form1.conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();


SqlCommand GMD = new SqlCommand("select * from ROW_MATRIAL", Form1.conn);
SqlDataAdapter FG = new SqlDataAdapter(GMD);
DataTable VB = new DataTable();


Form1.conn.Open();
da.Fill(dt);
FG.Fill(VB);
Form1.conn.Close();


dataGridView1.DataSource = dt;


DataGridViewComboBoxColumn colMaterial = new DataGridViewComboBoxColumn();
colMaterial.DataPropertyName = "ROW";
colMaterial.DataSource = new BindingSource(VB, null);
colMaterial.DisplayMember = "ROWS";
colMaterial.ValueMember = "ID";
colMaterial.DisplayIndex = 0;
dataGridView1.Columns.Add(colMaterial);



خیلی خیلی ممنون.درست شد .واقعا دستتون درد نکنه اذیتتون کردم. .ان شاء الله
از خدا هر چی بخوای بهتون بده

.