ورود

View Full Version : سوال: اتصال DataGrid به بانک Sql



Davood_amega
شنبه 16 مرداد 1389, 15:10 عصر
سلام به مهندسین عزیز
در حال نوشتن برنامه ای در 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;و بعد از آن به تعداد رکوردهای فیلد موردنظر رکورد اضافه می کند اما به شکل زیر :

http://barnamenevis.org/forum/attachment.php?attachmentid=53748&stc=1&d=1281178945

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

مهدی فرزاد
یک شنبه 17 مرداد 1389, 00:49 صبح
از Linq to sql استفاده کنید اینم مثال بسیار ساده
درضمن "{ItemsSource="{Binding هم نمی خواد

aghayex
یک شنبه 17 مرداد 1389, 06:24 صبح
اینو چک کن



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
دوشنبه 18 مرداد 1389, 10:22 صبح
و بعد از آن به تعداد رکوردهای فیلد موردنظر رکورد اضافه می کند اما به شکل زیر :

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

Shahab_H
دوشنبه 12 مهر 1389, 17:45 عصر
از 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
دوشنبه 12 مهر 1389, 19:23 عصر
مهندس آخر اینو تست کردی ؟

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

Shahab_H
دوشنبه 12 مهر 1389, 19:52 عصر
بله این گزینه از اول true بود

داشتم نمونه برنامه ی جناب Mehdi550u (http://barnamenevis.org/forum/member.php?u=67273) رو می دیدم! تو propreties دیتاگریدها یه تفاوت هایی وجود داشت! مثلا مال من Itemsource تو لیستش نبود البته از طریق کد میشه ازش استفاده کرد. ممکنه ایراد از Datagird باشه؟ از کجا میشه فهمید؟

مهدی فرزاد
دوشنبه 12 مهر 1389, 21:52 عصر
بله این گزینه از اول true بود

داشتم نمونه برنامه ی جناب Mehdi550u (http://barnamenevis.org/forum/member.php?u=67273) رو می دیدم! تو 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
دوشنبه 12 مهر 1389, 23:55 عصر
سلام
فایل برنامت رو ضمیه کن ببینم
و درضمن در روشی که من مثال زدم اصلا احتیاجی به تنظیم 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

مهدی فرزاد
سه شنبه 13 مهر 1389, 21:55 عصر
سلام
من کدها رو دیدم مشکل شما در جستجو کاربر هاست؟؟
شما کدهارو خیلی پیچوندید
اگه مشکل در همین قسمت هست که من گفتم
بگید تا کدها رو براتون اصلاح کنم
روشی که بکار بردید از نظر من زیاد مناسب نیست

Shahab_H
سه شنبه 13 مهر 1389, 22:25 عصر
سلام
من کدها رو دیدم مشکل شما در جستجو کاربر هاست؟؟
شما کدهارو خیلی پیچوندید
اگه مشکل در همین قسمت هست که من گفتم
بگید تا کدها رو براتون اصلاح کنم
روشی که بکار بردید از نظر من زیاد مناسب نیست

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

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

مهدی فرزاد
سه شنبه 13 مهر 1389, 23:48 عصر
سلام
سعی مکیکنم تا فردا نمونه مناسب رو بهتون بدم

Shahab_H
جمعه 16 مهر 1389, 16:30 عصر
خیلی خیلی لطف می کنید:لبخندساده:

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

Shahab_H
یک شنبه 18 مهر 1389, 20:07 عصر
خیلی خیلی خیلی طف کردین واقعا ممنونمو شرمنده
امیدوارم بتونم جبران کنم:لبخندساده:

Davood_amega
یک شنبه 18 مهر 1389, 23:14 عصر
سلام بهتر دیدم در همین تاپیک مشکلم رو توضیح بدهم .
یک 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 را پاک می کنم اصلا ارتباط برقرار نمی شود .

مهدی فرزاد
یک شنبه 18 مهر 1389, 23:23 عصر
سلام
چرا دیتا تیبل؟؟
از Linq استفاده کن
مثال منو ببین
مشکلت حل میشه
ItemSource="{Binding هم نمیخواد

Davood_amega
یک شنبه 18 مهر 1389, 23:43 عصر
متاسفانه از ابتدا از این روش استفاده نکرده ام . دیگه وسط کار نمیتونم تغییرات را اعمال کنم .

مهدی فرزاد
یک شنبه 18 مهر 1389, 23:53 عصر
مشه نمونه کدت رو ببینم؟
برام میل کن

Davood_amega
دوشنبه 19 مهر 1389, 10:30 صبح
مشکل برطرف شد . در ستونهای که به DataTable متصل نیست از کد زیر استفاده کردم .

<DataGridTextColumn Binding="{Binding Path=A,Mode=TwoWay}"/>که این A به جای متصل نیست .

Davood_amega
دوشنبه 19 مهر 1389, 10:53 صبح
مشکلات پشت هم داره میاد .
بنده در 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
سه شنبه 20 مهر 1389, 00:42 صبح
لطفا کمک کنید !
به چه صورتی اصلا میشه با برنامه نویس سطر اضافه کرد !

Davood_amega
چهارشنبه 21 مهر 1389, 00:28 صبح
مشکل حل شد فقط کد زیر رابه یک Grid اختصاص دادم

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




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