# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WPF > سوال: اتصال DataGrid به بانک Sql

## Davood_amega

سلام به مهندسین عزیز
در حال نوشتن برنامه ای در WPF هستم اما برای اتصال بانک با یک DataGrid دچار مشکل شده ام .
ابتدا یک DataGrid به XAML اضافه می کنم و کد زیر را هم اضافه می کنم .
 ItemsSource="{Binding}" یک Stored Procedure دارم که برای Select کردن یک فیلد از بانک استفاده می شود .کدش هم به صورت زیر است .
CREATE PROCEDURE Select_LegalName
AS
SELECT LT_Name
  FROM Legal_Type
GO
و در Visual Studio از کد زیر استفاده می کنم .
SqlConnection connect = new SqlConnection("Data Source=.;Initial Catalog=GuestHouse;uid=ADMIN;pwd=admin");
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommand command = new SqlCommand("SP_Select_LegalName", connect);
            da.SelectCommand = command;
            DataTable dt = new DataTable();
            dt.Columns.Add("نام");
            DataRow row;
            SqlDataReader reader;
            connect.Open();
            reader = command.ExecuteReader();
            while (reader.Read())
            {
                row = dt.NewRow();
                row[0] = reader.GetSqlString(0);
                dt.Rows.Add(row);
            }

            DataView view=new DataView(dt);
 datagrid1.DataContext = view;و بعد از آن به تعداد رکوردهای فیلد موردنظر رکورد اضافه می کند اما به شکل زیر :

ضمنا از Dataset و همچنین DataTable هم استفاده کردم اما تغییری نکرد .

----------


## مهدی فرزاد

از Linq to sql استفاده کنید اینم مثال بسیار ساده
درضمن   "{ItemsSource="{Binding هم نمی خواد

----------


## aghayex

اینو چک کن


SqlConnection sqlcon = newSqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto  ry|\\db\\Database1.mdf;Integrated Security=True;User Instance=True");
DataTable ds = new DataTable();
SqlDataAdapter sqldc = new SqlDataAdapter();
sqldc.SelectCommand = new SqlCommand();
sqldc.SelectCommand.Connection = sqlcon;
sqldc.SelectCommand.CommandText = aSP_Select_LegalName;
sqldc.SelectCommand.CommandType = 

CommandType.StoredProcedure;
sqlcon.Open();
sqldc.SelectCommand.ExecuteNonQuery();
sqldc.Fill(ds);
if (ds.Rows.Count > 0)
{
dg1.DataContext = ds.DefaultView;
}

----------


## ashkan209

> و بعد از آن به تعداد رکوردهای فیلد موردنظر رکورد اضافه می کند اما به شکل زیر :


این خط رو قبل از سطر آخر اضافه کن
   DataGrid1.AutoGenerateColumns = True

----------


## Shahab_H

> از Linq to sql استفاده کنید اینم مثال بسیار ساده
> درضمن   "{ItemsSource="{Binding هم نمی خواد


در پروژه ی شما یک textBox اضافه کردم و تو textChanged نوشتم 
        private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            var q = from a in Db.Tests
                    where a.FirstName.Contains(textBox1.Text)
                    select a;
            dataGrid1.ItemsSource = q;
        }

تو برنامه شما کاملا سرچ رو درست انجام میده و با پاک شدن textBox دوباره تمام رکوردها نشون داده میشه

ولی عین همین رو تو برنامه ی خودم استفاده کردم به محض وارد کرد اولین کاراکتر در textBox رکوردها میرن و دقیقا همون مشکل اول این تاپیک پیش میاد!

لطفا راهنمایی کنید

----------


## Davood_amega

مهندس آخر اینو تست کردی ؟



> این خط رو قبل از سطر آخر اضافه کن
>    DataGrid1.AutoGenerateColumns = True

----------


## Shahab_H

بله این گزینه از اول true بود

داشتم نمونه برنامه ی جناب Mehdi550u رو می دیدم! تو propreties دیتاگریدها یه تفاوت هایی وجود داشت! مثلا مال من Itemsource تو لیستش نبود البته از طریق کد میشه ازش استفاده کرد. ممکنه ایراد از Datagird باشه؟ از کجا میشه فهمید؟

----------


## مهدی فرزاد

> بله این گزینه از اول true بود
> 
> داشتم نمونه برنامه ی جناب Mehdi550u رو می دیدم! تو propreties دیتاگریدها یه تفاوت هایی وجود داشت! مثلا مال من Itemsource تو لیستش نبود البته از طریق کد میشه ازش استفاده کرد. ممکنه ایراد از Datagird باشه؟ از کجا میشه فهمید؟


سلام
فایل برنامت رو ضمیه کن ببینم 
و درضمن در روشی که من مثال زدم اصلا احتیاجی به تنظیم  ItemsSource در دیتا گردید ندارید
اما اگه میخواید DataGrid1.AutoGenerateColumns = True  باید برای هرکدوم از فیلدهایی که در دیتا گرید دارید Binding درست کنید
  <Custom:DataGridTextColumn Binding="{Binding LastName}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontFamily="Tahoma" Header="نام خانوادگی" IsReadOnly="True" Width="150" />

----------


## Shahab_H

> سلام
> فایل برنامت رو ضمیه کن ببینم 
> و درضمن در روشی که من مثال زدم اصلا احتیاجی به تنظیم  ItemsSource در دیتا گردید ندارید
> اما اگه میخواید DataGrid1.AutoGenerateColumns = True  باید برای هرکدوم از فیلدهایی که در دیتا گرید دارید Binding درست کنید
>   <Custom:DataGridTextColumn Binding="{Binding LastName}" CanUserReorder="False" CanUserResize="False" CanUserSort="False" FontFamily="Tahoma" Header="نام خانوادگی" IsReadOnly="True" Width="150" />


من false رو هم امتخان کردم
کدم دقیقا مثل مثال شماست ولی تو برنامه شما کاملا درست کار می کنه ولی تو برنامه ی خودم نه
ممنون از توجهتون :لبخند: 

فقط به خاطر تصاویر حجمش بالاست اگر داونلودش براتون سخته لطفا بگین تصویرها رو بردارم
بازم ممنون
http://www.4shared.com/file/bu5n0Fy3/Accounting.html

----------


## مهدی فرزاد

سلام
من کدها رو دیدم مشکل شما در جستجو کاربر هاست؟؟
شما کدهارو خیلی پیچوندید
اگه مشکل در همین قسمت هست که من گفتم
بگید تا کدها رو براتون اصلاح کنم
روشی که بکار بردید از نظر من زیاد مناسب نیست

----------


## Shahab_H

> سلام
> من کدها رو دیدم مشکل شما در جستجو کاربر هاست؟؟
> شما کدهارو خیلی پیچوندید
> اگه مشکل در همین قسمت هست که من گفتم
> بگید تا کدها رو براتون اصلاح کنم
> روشی که بکار بردید از نظر من زیاد مناسب نیست


نمی دونم چطور تشکر کنم که انقدر وقت می ذارید :لبخند: 

مشکل اصلی اینه که بعد سرچ تو دیتا گرید سطرها خالی نشون داده میشه شبیه پست اول همین تاپیک! ولی خیلی خوشحال مشیم شیوه ی بهتر جستوجو رو هم بهم بگین :چشمک:

----------


## مهدی فرزاد

سلام
سعی مکیکنم تا فردا نمونه مناسب رو بهتون بدم

----------


## Shahab_H

خیلی خیلی لطف می کنید :لبخند:

----------


## مهدی فرزاد

سلام
ببخشید کمی تاخیر داشتم
قسمت جستجو رو نگاه کنید من کدهای اضافی دیگه رو حذف کردم تا فقط کدهای جستجو را ببیند
به تعریف دیتا گرید هم در کد Xaml دقت کنید
البته پیشنهاد میکنم اطلاعات را درون یک لیست بریزید و از در اون آن عمل جستجو را انجام دهید تا ارتباط شما با دیتابیس قطع باشد
http://www.4shared.com/file/yF5XBNnX/Accounting.html

----------


## Shahab_H

خیلی خیلی خیلی طف کردین واقعا ممنونمو شرمنده
امیدوارم بتونم جبران کنم :لبخند:

----------


## Davood_amega

سلام بهتر دیدم در همین تاپیک مشکلم رو توضیح بدهم .
یک DataGrid دارم که ارتباط با بانکم را به صورت زیر برقرار می کنم .
در Xaml
<DataGrid Name="dtgStuff" AutoGenerateColumns="False" ItemSource="{Binding}">
   <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding Path=Stuff_Name}"  Header="نام" IsReadOnly="True" />
      <DataGridTextColumn FontFamily="B Nazanin" FontSize="14" Header="تعداد کل" />
   </DataGrid.Columns>
</DataGrid>در Code
dtgStuff.DataContext= ...(DatatTble)... حالا وقتی ارتباط برقرار می شود مشکلی نیست و ستون مربوط به نام را میاره ولی تعداد کل را می خواهم خودم وارد کنم ولی وقتی اطلاعات را وارد می کنم و LostFocus می شود اطلاعات مربوط به تعداد کل پاک می شود .
به نظرم به خاطر ارتباط با DataGrid ، اما وقتی ItemSource را پاک می کنم اصلا ارتباط برقرار نمی شود .

----------


## مهدی فرزاد

سلام
چرا دیتا تیبل؟؟
از Linq استفاده کن
مثال منو ببین
مشکلت حل میشه
ItemSource="{Binding هم نمیخواد

----------


## Davood_amega

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

----------


## مهدی فرزاد

مشه نمونه کدت رو ببینم؟
برام میل کن

----------


## Davood_amega

مشکل برطرف شد . در ستونهای که به DataTable متصل نیست از کد زیر استفاده کردم .
<DataGridTextColumn Binding="{Binding Path=A,Mode=TwoWay}"/>که این A به جای متصل نیست .

----------


## Davood_amega

مشکلات پشت هم داره میاد .
بنده در DataTable ام دو ستون دارم که دو ستون DataGrid راپرمیکنه ولی DataGridام 7ستون داردکه 5 ستونشو خودم پر می کنم . 
DataTable1.Columns.Add("Stuff_Name");
DataTable1.Columns.Add("Stuff_Qty");
                    .
                    .
                    .
DataGrid1.DataContext=DataTable1;
وبا کد زیر می توان مقدار DataGrid را به دست آورد .
string ID = ((DataRowView)(this.DataGrid1.CurrentItem)).Row.It  emArray[1].ToString();و یا از کد زیر :
string value = ((TextBlock)DataGrid1.SelectedCells[1].Column.GetCellContent(DataGrid1.SelectedCells[0].Item)).Text;ولی وقتی ازش استفاده می کنم فقط 2 تا ستون که با DataTable تعریف کردم را فقط میشناسه! 
بعد DataTable به صورت زیر تغییر دادم :
DataGrid1.Columns.Add("Stuff_Name");
DataGrid1.Columns.Add("Stuff_Qty");
DataGrid1.Columns.Add("Stuff_CoffeeQty");
DataGrid1.Columns.Add("Stuff_SaleCost");
DataGrid1.Columns.Add("Stuff_BuyCost");
DataGrid1.Columns.Add("Stuff_Cost");
DataGrid1.Columns.Add("Stuff_ID");
در Xaml :<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Stuff_Name}"/>
<DataGridTextColumn Binding="{Binding Stuff_Qty,Mode=TwoWay}"/>
<DataGridTextColumn Binding="{Binding Stuff_CoffeeQty,Mode=TwoWay}"/>
<DataGridTextColumn Binding="{Binding Stuff_SaleCost,Mode=TwoWay}"/>
<DataGridTextColumn Binding="{Binding Stuff_BuyCost,Mode=TwoWay}"/>
<DataGridTextColumn Binding="{Binding Stuff_Cost,Mode=TwoWay}" />
<DataGridTextColumn Binding="{Binding Stuff_ID}" />
</DataGrid.Columns>

اما مقادیرش تغییر نمی کنه ! این Mode=TwoWay چرا کار نمی کنه ؟
  :گریه:   :خیلی عصبانی:   :گریه:   :خیلی عصبانی:   :گریه:

----------


## Davood_amega

لطفا کمک کنید !
به چه صورتی اصلا میشه با برنامه نویس سطر اضافه کرد !

----------


## Davood_amega

مشکل حل شد فقط کد زیر رابه یک Grid اختصاص دادم
dtgStuff.DataContext= ...(DatatTble)... 
 ضمنا برای به دست آوردن سلول خاصی در DataGrid از کد زیر استفاده کردم !

MessageBox.Show(((DataRowView)DataGrid1.Items[i]).Row[j].ToString());

----------

