PDA

View Full Version : DataBindings.Add() Problem.



hdv212
دوشنبه 07 آبان 1386, 09:02 صبح
سلام
من یه دیتاگرید ویو دارم که داده ها توش نمایش داده میشن، حالا میخوام روی هر رکوردی که میره اطلاعات اون توی کنترل های مخصوص خودش نمایش داده بشن، منتها نمیدونم چطوری، قبلا اینکار رو با DataRow انجام میدادم، ولی حالا با DataBinding میخوام انجام بدم، فرض کنید یه تابعی دارم که کنترل ها رو بایند میکنه :

private void BindData()
{
this.txt_customerID.DataBindings.Add("Text", this.dt, "customerID");
this.txt_companyName.DataBindings.Add("Text", this.dt, "companyName");
this.txt_city.DataBindings.Add("Text", this.dt, "city");
this.txt_country.DataBindings.Add("Text", this.dt, "country");
}
و اینطوری هم فراخوانی میکنم :

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
this.BindData();
}

منتها در runTime این Exception اتفاق میفته :

This causes two bindings in the collection to bind to the same property.
Parameter name: binding

ممنون میشم راهنماییم کنید، مرسی

PC2st
دوشنبه 07 آبان 1386, 19:27 عصر
چون در رویداد SelectionChanged متد BindData برای بیش از یک بار صدا زده میشه، پس در رویدادی مثل Load فرم، متد BindData را فقط یک بار صدا بزنین.

Mahdi.Kiani
سه شنبه 08 آبان 1386, 07:26 صبح
خوب باید هم خطا بده
چون هر کنترلی را یکبار بیشتر نمیشه Bind کرد
یا اینکه همونطور که گفت شد در رویدادی بنویسید که فقط یکبار عمل Bind انجام بگیره مثل load یا در متد Copnstructor بعد از InitializeComponents
یا اینکه اگر نمی خواین این کار را بکنین قبل از Bind کردن اونا را Clear کنین





private void BindData()
{

this.txt_customerID.DataBindings.Clear();
this.txt_companyName.DataBindings.Cleare();
this.txt_city.DataBindings.Clear();
this.txt_country.DataBindings.Cleare();



this.txt_customerID.DataBindings.Add("Text", this.dt, "customerID");
this.txt_companyName.DataBindings.Add("Text", this.dt, "companyName");
this.txt_city.DataBindings.Add("Text", this.dt, "city");
this.txt_country.DataBindings.Add("Text", this.dt, "country");


}

hdv212
سه شنبه 08 آبان 1386, 23:36 عصر
من تابعم رو به صورت زیر اصلاح کردم ولی باز نتیجه نداشت :

private void BindData()
{
this.txt_customerID.DataBindings.Clear();
this.txt_companyName.DataBindings.Clear();
this.txt_city.DataBindings.Clear();
this.txt_country.DataBindings.Clear();

this.txt_customerID.DataBindings.Add("Text", this.dt, "customerID");
this.txt_companyName.DataBindings.Add("Text", this.dt, "companyName");
this.txt_city.DataBindings.Add("Text", this.dt, "city");
this.txt_country.DataBindings.Add("Text", this.dt, "country");
}
من هم در رویداد Load و هم در رویداد dataGridView1_SelectionChanged این تابع رو فراخوانی کردم ولی در زمان اجرا، فقط محتویات رکورد اول رو توی کنترل های نشون میده و وقتی روی رکوردهای بعدی میرم، اطلاعاتش رو نشون نمیده، میشه بگین شما چطوری این کار رو میکنید ؟

ir_programmer
چهارشنبه 09 آبان 1386, 16:17 عصر
تابع Bind رو بدون Clear بنویس و فقط در قسمت Load صدا بزن. با تغییر فوکس در گرید ، اطلاعات عوض میشه. در مورد جستجو در گرید میتونی از Find بهره ببری.

hdv212
چهارشنبه 09 آبان 1386, 16:33 عصر
مشکلم رو پیدا کردم، اینکه چرا فقط محتویات رکورد اول رو نشون میده و روی رکوردهای بعدی عمل نمیکنه، چون در در خط زیر datagridview رو به صورت زیر بایند کردم :

this.dataGridView1.DataSource = this.dt.DefaultView;
یعنی از خاصیت DefaultView استفاده کردم، در صورتی که در تابع BindData آبجکت dt رو به صورت زیر آوردم :

this.txt_customerID.DataBindings.Add("Text", this.dt, "customerID");
با اصلاح کردن تابع BindData به صورت زیر :

private void BindData()
{
this.txt_customerID.DataBindings.Clear();
this.txt_companyName.DataBindings.Clear();
this.txt_city.DataBindings.Clear();
this.txt_country.DataBindings.Clear();

this.txt_customerID.DataBindings.Add("Text", this.dt.DefaultView, "customerID");
this.txt_companyName.DataBindings.Add("Text", this.dt.DefaultView, "companyName");
this.txt_city.DataBindings.Add("Text", this.dt.DefaultView, "city");
this.txt_country.DataBindings.Add("Text", this.dt.DefaultView, "country");
}
و فراخوانی اون در رویداد load مربوط به فرمم، مشکل حل شد و نیازی به فراخوانی مجدد اون در این رویداد نیست :

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
this.BindData();
}
اینم یه تجریه بود که شاید شما هم باهاش برخورد نداشتید، به هر صورت از توجهتون ممنون.