PDA

View Full Version : سوال: هماهنگ سازی بین دیتا گریدویو و لیبلها



bahram1100
جمعه 25 آذر 1390, 23:08 عصر
با عرض سلام خدمت دوستان
من برنامه ای نوشتم که شامل یک دیتا گرید ویو و چند لیبل می باشد.میخواهم وقتی روی یکی از ردیف ها کلیک می کنم اطلاعاتش به تفکیک روی لیبل ها نمایش داده شود که از بایند استفاده کردم .
وقتی برای اولین بار کلیک روی یکی از رکوردها می کنم اطلاعات را در لیبل ها نمایش می دهد ولی برای دفعه دوم که می خوام روی یکی از ردیف ها کلیک کنم به این ارور بر می خورم :
This causes two bindings in the collection to bind to the same property.
Parameter name: binding
مشکل از کجاست ؟
من چه کدی را باید بزنم تا به این ارور بر نخورم؟
ممنون

AliSaeedi_v
جمعه 25 آذر 1390, 23:38 عصر
سلام کدت رو میذاشتی بفهمیم!!
کدت رو توی try-catchبزار دوباره امتحان کن.فقط توی catch بنویس return

bahram1100
جمعه 25 آذر 1390, 23:44 عصر
یه تابع ساختم:
string code_old;
//باید کردن فیلدها
public void bind(string a)
{
SqlDataAdapter da = new SqlDataAdapter("", con);
da.SelectCommand.CommandText = "Select * from Films where code=" + a;
DataSet ds = new DataSet();
da.Fill(ds, "t1");
label8.DataBindings.Add("Text", ds.Tables["t1"], "Name");
label9.DataBindings.Add("Text", ds.Tables["t1"], "Subject");
label10.DataBindings.Add("Text", ds.Tables["t1"], "Year");
label11.DataBindings.Add("Text", ds.Tables["t1"], "Point");
label12.DataBindings.Add("Text", ds.Tables["t1"], "Time");
label13.DataBindings.Add("Text", ds.Tables["t1"], "Zirnevis");
textBox1.DataBindings.Add("Text", ds.Tables["t1"], "Story");
if (ds.Tables["t1"].Rows[0]["Photo"] == DBNull.Value)
pictureBox1.Image = null;
else
{
byte[] arrPic = (byte[])(ds.Tables["t1"].Rows[0]["Photo"]);
MemoryStream ms = new MemoryStream(arrPic);
Image.FromStream(ms);
pictureBox1.DataBindings.Add(new System.Windows.Forms.Binding("Image", ds.Tables["t1"], "Photo", true));
}
code_old = a;
بعد تو رویداد کلیک گریدویو نوشتم :
this.bind(dataGridView1.SelectedRows[0].Cells[0].Value.ToString());

bahram1100
جمعه 25 آذر 1390, 23:47 عصر
ارورمیگه دو تا بایند داره صورت میگیره یعنی اینکه وقتی دفعه دوم کلیک می کنم دستور ( بایند ) اول که صورت گرفته هنوز تو حافظه اش هست.
باید یه کاری کنیم بایند قبلی حذف و بایند جدید که حاوی اطلاعات جدیده جایگزین آن شود.
کسی میدونه؟

mahan77
جمعه 25 آذر 1390, 23:55 عصر
با عرض سلام خدمت دوستان
من برنامه ای نوشتم که شامل یک دیتا گرید ویو و چند لیبل می باشد.میخواهم وقتی روی یکی از ردیف ها کلیک می کنم اطلاعاتش به تفکیک روی لیبل ها نمایش داده شود که از بایند استفاده کردم .
وقتی برای اولین بار کلیک روی یکی از رکوردها می کنم اطلاعات را در لیبل ها نمایش می دهد ولی برای دفعه دوم که می خوام روی یکی از ردیف ها کلیک کنم به این ارور بر می خورم :
This causes two bindings in the collection to bind to the same property.
Parameter name: binding
مشکل از کجاست ؟
من چه کدی را باید بزنم تا به این ارور بر نخورم؟
ممنون

با سلام.
چرا از این کد استفاده نمی کنی؟
;()label1.text=datagridview1.currentrows.cells["esme column"].value.tostring

bahram1100
شنبه 26 آذر 1390, 00:14 صبح
یه مشکل این کد داره :
اینه که هر ستونی که در گرید ویو هستا میشه با این کد نوشت در صورتی که من فیلدهایی دارم که در دیتا گرید نیاورده ام ولی می خواهم در لیبل ها نمایش دهم و مشکل دومش اینه که من عکس هم دارم که تو پیکچر باکس نمایش داده میشه ( در قسمت کدها معلومه ) پس باید حتما از بایند استفاده کنم.

bahram1100
شنبه 26 آذر 1390, 13:38 عصر
من 10 فیلد در جدولم دارم و فقط 4 فیلد آن را در گرید ویو نمایش دادم .
حال من 9 لیبل و یک پیکچرباکس کذاشتم بالای صفحه در حالی گرید ویو در پایین همان صفحه است.میخوام وقتی کاربر روی یکی از رکوردهای گریدویو کلیک میکنه تمام مشخصات آن رکورد که شامل 10 چیز است نمایش داده شود.
من از بایند استفاده کردم ولی جواب نمیده چون دفعه اول عملیات بایند را انجام میده ولی برای دفعه های بعدی ارور میده و میگه بایند کردن دوچیز همزمان امکان پذیر نیست(در بالا ارورم را نوشتم)
نمیدونم چی کار کنم.لطفا کمک کنید
ممنون

bahram1100
شنبه 26 آذر 1390, 21:09 عصر
عزیزان کسی که جواب من را نداد.
بالاخره خودم فهمیدم.گفتم بگم که اگه کسی به این مشکل برخورد مثل من دردسر نکشه:
بایدبایند های پیشین که صورت گرفته را پاک کرد ، مانند :

label1.databinding.clear();

bahram1100
شنبه 26 آذر 1390, 21:37 عصر
حال یه سوال دیگه از دوستان دارم:
من بایند کردن لیبل ها را در رویداد کلیک گریدویو نوشتم تا وقتی روی یک ردیف کلیک شود اطلاعات نمایش و عملیات بایند انجام شود.
کدام رویداد گریدویو است که بدون اینکه کلیک کنیم و فقط با بالا و پایین آوردن توسط کیبورد روی رکوردها عملیات بایند انجام شود به عبارتی هیچ دکمه ای زده نشود؟
کدام رویداد گریدویو است که با فشار دادن کلید اینتر بر روی رکورد مورد نظر عملیات بایند انجام می شود ؟
تشکر

bahram1100
یک شنبه 27 آذر 1390, 15:03 عصر
کسی از دوستان رویدادهای گریدویو را نمیدونه تا به من کمک کنه؟

Mahmoud Zaad
یک شنبه 27 آذر 1390, 16:41 عصر
توی رویداد KeyDown دیتاگریدویو می تونی بنویسی مثلا کدی مثل کد زیر، ولی خب باید توجه کنی زمانیکه سلول در حال ویرایش هست جواب نمیده و اینکه خطای سطر آخر (که اتوماتیک اضافه میشه) رو هم باید مدیریت کنی.
if (e.KeyCode == Keys.Up||e.KeyCode==Keys.Down||e.KeyCode==Keys.Ent er)
{
MessageBox.Show(dataGridView1.CurrentRow.Cells["id"].Value.ToString());
}

bahram1100
یک شنبه 27 آذر 1390, 20:17 عصر
من کدی که آقا میثم گفتند به این صورت زدم :

if (e.KeyCode==Keys.Up || e.KeyCode==Keys.Down || e.KeyCode==Keys.Enter)
bind(dataGridView1.SelectedRows[0].Cells[0].Value.ToString());
ولی مشکل این کد این جاست که وقتی روی رکورد دوم هستی بایند رکورد اول و وقتی روی رکورد سوم هستی بایند رکورد دوم را نشان می دهد و به همین صورت....
کسی میتونه این کد را ویرایش کنه یا راه جدیدی بگه؟

Mahmoud Zaad
یک شنبه 27 آذر 1390, 20:33 عصر
من کدی که آقا میثم گفتند به این صورت زدم :

if (e.KeyCode==Keys.Up || e.KeyCode==Keys.Down || e.KeyCode==Keys.Enter)
bind(dataGridView1.SelectedRows[0].Cells[0].Value.ToString());
ولی مشکل این کد این جاست که وقتی روی رکورد دوم هستی بایند رکورد اول و وقتی روی رکورد سوم هستی بایند رکورد دوم را نشان می دهد و به همین صورت....
کسی میتونه این کد را ویرایش کنه یا راه جدیدی بگه؟

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

bahram1100
یک شنبه 27 آذر 1390, 20:36 عصر
نمیشه نره سطر بعد و بایند کنه؟
نمیشه از رویداد Keypress استفاده کرد؟
اگه میشه چطوری؟

Mahmoud Zaad
یک شنبه 27 آذر 1390, 22:16 عصر
بفرما دوست عزیز، دیگه مدیریت خطاشو خودت انجام بده.
try
{
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
{
listBox1.Items.Clear();
listBox1.Items.Add(dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells["id"].Value.ToString());
}
if (e.KeyCode == Keys.Up)
{
listBox1.Items.Clear();
listBox1.Items.Add(dataGridView1.Rows[dataGridView1.CurrentRow.Index - 1].Cells["id"].Value.ToString());
}
}
catch (Exception er)
{
MessageBox.Show(er.Message);
}

bahram1100
یک شنبه 27 آذر 1390, 22:35 عصر
آقا میثم ممنون از توضیحی که دادین ولی مشکل اصلی اینه که مبتدیم و برام جا نیفتاد
اصلا نمیدونم مدیریت خطا یعنی چی
معلوم نیست این لیست باکس تو کدها از کجا اومده
من از این کد هم استفاده کردم ولی به ارور بر می خورم :

if (e.KeyCode==Keys.Up)
bind(dataGridView1.SelectedRows[-1].Cells[0].Value.ToString());
مشکل کد من چیه؟
تشکر از توجه فراوان شما

Mahmoud Zaad
دوشنبه 28 آذر 1390, 08:52 صبح
آقا میثم ممنون از توضیحی که دادین ولی مشکل اصلی اینه که مبتدیم و برام جا نیفتاد
اصلا نمیدونم مدیریت خطا یعنی چی
معلوم نیست این لیست باکس تو کدها از کجا اومده
من از این کد هم استفاده کردم ولی به ارور بر می خورم :

if (e.KeyCode==Keys.Up)
bind(dataGridView1.SelectedRows[-1].Cells[0].Value.ToString());
مشکل کد من چیه؟
تشکر از توجه فراوان شما

لیست باکس رو من برای امتحان کدهای خودم استفاده کردم شما به جای listBox1.Items.Add همون Bind رو بنویس یا هر چیز دیگه ای.
منظورم از مدیریت خطا اینه که شما با کدهایی که گفتم دو جا به مشکل بر می خوری یکی زمانیکه در سطر اول هستی و کلید Up رو می زنی، دوم زمانیکه در سطر آخر هستی و اینتر یا Down زده میشه حالا باید با ifی چیزی، اجازه ندی خطا صورت بگیره، همین!