PDA

View Full Version : اضافه کردن ردیف به datagridview



ghasem167
سه شنبه 19 دی 1391, 11:10 صبح
سلام.یه چیزی خیلی کلافه ام کرده.یک دیتا گرید ویو دارم که میخام طی یک فرآیند بازگشتی هر بار بهش ردیف های جدید اضافه بشه.من برای اتصال این دیتا گرید ویو از linq استفاده کردم و تنها دستوری که برای این کار بلدم datagrid.datasource است.منتها این دستور محتوای قبلی دیتا گرید رو پاک می کنه ولی من میخام محتوای جدید به انتهای همین گرید ویو اضافه بشه و محتوای قبلی پاک نشه.چطور میشه این کار رو کرد آیا احتیاج به تابع خاصی داره یا در امکانات خود دیتا گرید ویو یا لینک هست؟
برای بهتر فهمیدن کد رو هم میزارم:
protected void treetogrid(TreeNode trn, DataGridView dgv)
{
linqDataContext db = new linqDataContext();
dgv.DataSource = db.kgselect(int.Parse(trn.Name));
foreach (TreeNode tn in trn.Nodes)
{
treetogrid(tn, dgv);
}

}

asghar2008
سه شنبه 19 دی 1391, 11:49 صبح
سلام
باید AllowUserToAddRows را در دیتاگرید ویو مساوی True قرار بدی.
this.dataGridView1.AllowUserToAddRows = true

ghasem167
سه شنبه 19 دی 1391, 11:58 صبح
سلام
باید AllowUserToAddRows را در دیتاگرید ویو مساوی True قرار بدی.
this.dataGridView1.AllowUserToAddRows = true

این رو true کنم بعد از دستور datasource استفاده کنم حل میشه؟

ghasem167
سه شنبه 19 دی 1391, 12:00 عصر
فک کنم سوالم رو خوب متوجه نشدید.چون اصلا مشکلم اینه که نمیدونم چطور محتوای قبلی دیتا گرید ویو رو نگه دارم و محتوای جدید رو هم بهش اضافه کنم.

asghar2008
سه شنبه 19 دی 1391, 12:42 عصر
دوست عزیز رکورد های شما در بانک ذخیره میشه؟

یا فقط تو خود گرید ویو؟

ایجاد سطر جدید در گرید ویو (این برای اضافه کردن در گریدویو هست نه به بانک)


با استفاده از این کد
Dgrid.Rows.Add("", "", "");



جای "" مقادیرتو بزار .

اضافه کردن به بانک و نمایش در گریدویو

اگه dt (دیتاتیبل) به دیتاسورس DGV وصل هست شما باید رکورد جدید رو به dt اضافه کنید.چون اونموقع اطلاعات قبلی پاک نمیشه.
مثلا اگر ديتا سورس گريدتون ديتا تيبلي با نام dt هست بايد به dt اضافه كنيد:

dt.Rows.Add(2, 8, "asghar2008", true);

اطلاعات بیشتر در این تاپیک ، کلیک کن. (http://barnamenevis.org/showthread.php?353590-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%B3%D8%B7%D8%B1-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-%DA%AF%D8%B1%DB%8C%D8%AF-%D9%88%DB%8C%D9%88)

ghasem167
سه شنبه 19 دی 1391, 12:53 عصر
رکورد ها توسط دستور این دستور db.kgselect(int.Parse(trn.Name));
فراخوانی می شود.این دستور فقط دو ستون از جدول اصلی دیتا بیس رو بازیابی می کنه.این دو ستون در دیتا گرید ویو نمایش داده میشه و فقط بازیابی میشه اما در جایی از دیتا بیس ذخیره نمیشه.دیتا گرید ویو فقط به دستور گفته شده اتصال داره.

ghasem167
سه شنبه 19 دی 1391, 13:25 عصر
نه نمیخام به جدول دیتا بیس اضافه بشه.افزودن به دیتا بیس رو بلدم.اطلاعات گرید ویو از یک جدول دیتا بیس نمیاد بلکه از یک دستور بازیابی میاد.دستور بازیابی توی یک چرخه دایم تکرار میشه و میخام هربار نتایجش در دیتا گرید ویو اضافه بشه.

morteza271
سه شنبه 19 دی 1391, 13:35 عصر
به نظرم شما بیاین یه DataTable بسازید و اونو بدین به DataSource گردیدتون.
بعد رد هر بار که اون تابع اجرا میشه سطر جدید رو به این DataTable اضافه کنید.
اینطوری دیگه سطر جدید اتوماتیک به گرید هم اضافه میشه.
امیدوارم منظورمو متوجه شده باشید.

ghasem167
سه شنبه 19 دی 1391, 13:45 عصر
به نظرم شما بیاین یه DataTable بسازید و اونو بدین به DataSource گردیدتون.
بعد رد هر بار که اون تابع اجرا میشه سطر جدید رو به این DataTable اضافه کنید.
اینطوری دیگه سطر جدید اتوماتیک به گرید هم اضافه میشه.
امیدوارم منظورمو متوجه شده باشید.

میشه توضیح بدین محتوای جدولی که با linq به c# متصل شده روچطور به data table وارد کنم.

morteza271
سه شنبه 19 دی 1391, 13:47 عصر
میشه توضیح بدین محتوای جدولی که با linq به c# متصل شده روچطور به data table وارد کنم.
متاسفانه من زیاد با linq کار نکردم ولی مطمئنا میشه اینکار رو کرد.
این خروجی این دستور چیه؟
db.kgselect(int.Parse(trn.Name));

ghasem167
سه شنبه 19 دی 1391, 13:58 عصر
متاسفانه من زیاد با linq کار نکردم ولی مطمئنا میشه اینکار رو کرد.
این خروجی این دستور چیه؟
db.kgselect(int.Parse(trn.Name));

خروجی این دستور بازیابی یک جدول که شامل دو ستون یکی کد کالا و دیگری نام کالا هست.ورودی جدول هم کد گروه هست.یعنی این دستور کد ونام کالاهایی که کد گروهشون به عناون مثال 5 است رو برمی گردونه .

morteza271
سه شنبه 19 دی 1391, 14:05 عصر
خروجی این دستور بازیابی یک جدول که شامل دو ستون یکی کد کالا و دیگری نام کالا هست.ورودی جدول هم کد گروه هست.یعنی این دستور کد ونام کالاهایی که کد گروهشون به عناون مثال 5 است رو برمی گردونه .
پس خروجی این دستور یا یه جدولیه یا لیست و یا چیزی مشابه...
که خیلی راحت میتونید داده هاشو به داخل یک دیتاتیبل انتقال بدین...

ghasem167
سه شنبه 19 دی 1391, 17:28 عصر
چون با linq اطلاعات رو واکشی و دیتاسورس گریدویو رو تنظیم کردید سطر جدید رو هم به دیتاسورس باید اضافه کنید.
مثال بر اساس LinqToSql :
فرض کنید اطلاعات از یک StoredProcedure به نام StoredProcedure1 واکشی میشه.

using (DataClasses1DataContext db = new DataClasses1DataContext())
{
dataGridView1.DataSource = db.StoredProcedure1().ToList();
}

این SP بعد از اضافه شدن به مدل linq به یک متد تبدیل میشه. این متد یک خروجی از نوع StoredProcedure1Result خواهد داشت که اطلاعات را بعد از واکشی به لیستی از این نوع تبدیل میکنیم(متد tolist این کار را انجام میده).
برای افزودن به این لیست کافیه دیتاسورس گریدویو را بدست آورده و آیتم مورد نظر را به آن اضافه کرد:

List<StoredProcedure1Result> records = dataGridView1.DataSource as List<StoredProcedure1Result>;
StoredProcedure1Result t = new StoredProcedure1Result() { name = "Name", lastname = "LName" };
records.Add(t);
dataGridView1.DataSource = records.ToList();


خیلی خوب بود.ولی من مشکلم رو با کوئری حل کرد.اینجوری:
linqDataContext db = new linqDataContext();
var q = from k in db.kalahas
where k.group_id==int.Parse(trn.Name)
select new {k.kid, k.kname };
foreach (var row in q)
{
dgv.RowCount++;
dgv.Rows[dgv.Rows.Count-1].Cells[0].Value = row.kid;
dgv.Rows[dgv.Rows.Count-1].Cells[1].Value = row.kname;
}

aliramazani
یک شنبه 31 خرداد 1394, 21:34 عصر
چطوری میشه یه سطر به دیتاگرید اظافه کرد بدون ذخیره در دیتابیس؟ برای مثلا پیشنمایش

alireza264
دوشنبه 01 تیر 1394, 01:58 صبح
چطوری میشه یه سطر به دیتاگرید اظافه کرد بدون ذخیره در دیتابیس؟ برای مثلا پیشنمایش

سلام
بنظر از DataTable یا Dataset یا list برای پر کردن دیتاگرید استفاده میکنید. دو روش پیش روی شماست
1- روش binding که در اون بدلیل بایند شدن اشیا فوق با دیتا گرید کافیه که شما یه سطر به DataTable یا Dataset یا list اضافه کنید

DataTable Dt_Tbl = new DataTable();
Dt_Tbl.Rows.Add("asd","zxc",....);

DataSet Dt_Set=new DataSet ();
Dt_Set.Tables[0].Rows.Add("asd","zxc",....);

List<Person> listperson = new List<Person>();
listperson.Add(new Person(123,"asd","hff");



2- روش واگذاری مستقیم که یه سطر جدید به دیتا گرید اضافه می کنه

dataGridView1.Rows.Add("asd","zxc",....);

aliramazani
دوشنبه 01 تیر 1394, 08:49 صبح
جواب نمیده و پیغام خطا میده

alireza264
دوشنبه 01 تیر 1394, 09:52 صبح
سلام
تعداد ستون ها باید برابر تعداد پارامترهای ورودی باشه
132494


private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add(textBox1.Text, textBox2.Text);
}


روش binding که البته با wpf هستش و از یه دیتا بیس میخونه و تو DataTable میریزه و بعد لیستو باهاش پر میکنه دلیلش اینه امکان جستجو بر اساس حروف با استفاده از MvvM سریعتر میشه


listperson.Add(new Classes.Person(_Bind.Rows[i]["Cod_key"].ToString().Trim(),
_Bind.Rows[i]["Nam_Fa"].ToString().Trim()
(;
dataGrid1.ItemsSource = listperson;



<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Grid.Row="9" HorizontalAlignment="Stretch" Margin="0,0,1,1" Name="dataGrid1" VerticalAlignment="Stretch"
CanUserResizeRows="False" FlowDirection="RightToLeft" VerticalGridLinesBrush="#FF56B13B" FontFamily="B Nazanin" FontWeight="Bold"
HorizontalContentAlignment="Right" VerticalContentAlignment="Center" FontSize="13" Background="White" Grid.Column="1"
AlternatingRowBackground="#FFE5E5E5" SelectionChanged="dataGrid1_SelectionChanged" Loaded="dataGrid1_Loaded" Grid.ColumnSpan="2" Grid.RowSpan="2">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path= Cod_key}" Header="کد" Width="auto" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding Path= Nam_Fa}" Header="نام ونام خانوادگی" Width="auto" IsReadOnly="True" />

</DataGrid.Columns>

</DataGrid>


با استفاده از datatable
پر کردن ابتدا با رکورد های بانک


DataTable _Bind = new DataTable();
_Adapter.Fill(_Bind);
dataGrid1.DataContext = _Bind;


پر کردن مجدد بعد از اضافه کردن باسطر دلخواه

_Bind.Rows.Add("123", "Abc");
dataGrid1.DataContext = _Bind;


من به شخصه استفاده از لیست رو ترجیح میدم چون از Mvvm میشه استفاده کرد
لیست اولیه
132496
لیست در حین جستجو
132498

aliramazani
دوشنبه 01 تیر 1394, 10:13 صبح
دقیقا میخوام مثل لیست باکس عمل کنه.
یعنی تکس باکس مستقیم بره تو دیتاگرید.


ListBox.Items.Add(textbox.Text);

تو کد بالا مستقیم عمل میشه واسه گرید ویو همچین امکانی هست؟

alireza264
دوشنبه 01 تیر 1394, 10:31 صبح
آره اگه تعداد ستونها برابر یا بیشتر از تعداد ورودیها باشه عمل میکنه و ستون ها رو از چپ به راست پر میکنه

private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add(textBox1.Text, textBox2.Text);

}





البته اگه قبلا با list یا datatable پر شده باشه باید تعداد و نوع ورودیها با نوع فیلد های متناظر list یا datatable یکی باشه

aliramazani
سه شنبه 14 اردیبهشت 1395, 14:21 عصر
چطوری میشه یه سطر به دیتاگرید اظافه کرد بدون ذخیره در دیتابیس؟ برای مثلا پیشنمایش

چطوری یه سطر اضافه کنم ولی فقط برای یکی از ستونها داده ارسال بشه
مثلا دستور dgv.rows.add به تمام column ها داده میفرسته ولی من میخوام یه سطر اضافه بشه و فقط به یه ستون داده بده

hesam1354
دوشنبه 30 خرداد 1401, 12:51 عصر
سلام
من اول دیتا گریدم رو با تعداد ستونهای مورد نظر درست می کنم و مثلا اسمشو می زارم dgv
و بعد متدی مینویسم به اسم( BindDataGrid )که دیتا گریدم رو پر کنه , و بعد از هر تغییر اون متد رو فراخوانی می کنم
نکته اول اینکه اطلاعات رو داخل یه لیست مثلا لیست result ذخیره کن . هر بار که اطلاعاتی به لیستت اضافه میشه یا کم میشه یا ویرایش میشه و لیست رو بروز می کنی متد BindDataGrid رو فراخوانی کن
خلاصه متد رو برات می فرستم. من سالهاست از این روش استفاده می کنم و تا حالا مشکلی پیش نیومده. اگه سوالی داشتی باهام تماس بگیر 09001205554
153850