السلام عليكم
كيفية تحديث البيانات listbox بمجرد حفظ بيانات جديدة بقاعدة البيانات
السلام عليكم
كيفية تحديث البيانات listbox بمجرد حفظ بيانات جديدة بقاعدة البيانات
وعليكم السلام
جرب هذا
listBox1.Update();
alroaini100 كتب:
وعليكم السلام
جرب هذا
listBox1.Update();
للأسف لا يعمل
السلام عليكم
هل التطبيق على نفس الجهاز ولمستخدم واحد....اذا كان كذلك فما عليك الا اعادة تعبئة listbox
اذا كنت تقصد تعديل البيانات من خارج التطبيق...اسهل سيناريو هو استخدام الاجراءات المخزنه للاضافة.التعديل. الحذف...
واضافة الكود التالى بعد كل عمليه فى الاجراء المخزن..... بحيث ننشئ ملف نصى وفى كل مرة نضيف او نعدل فى الجدول يقوم باضافة نص للملف ومن ثم يتم مراقبته من خلال التطبيق ومعرفة ان بيانات الجدول تعدلت
لنفرض ان لدينا قاعدة بيانات Test وتحوى الجدول T1
USE [Test] GO /****** Object: Table [dbo].[T1] Script Date: 2/23/2014 2:03:34 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T1]( [id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
الاجراء المخزن التالى للاضافة
USE [Test]
GO
/****** Object: StoredProcedure [dbo].[usp_Add] Script Date: 2/23/2014 2:04:47 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[usp_Add]
-- Add the parameters for the stored procedure here
@name nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
INSERT INTO [dbo].[T1]
([Name])
VALUES
(@name)
execute xp_cmdshell 'echo DataChanged >>c:\test.txt'
ENDلاحظ هذا السطر execute xp_cmdshell 'echo DataChanged >>c:\test.txt'
حيث يقوم باضافة عبارة datachanged الى ملف نصى text.txt فى المسار c:
ربما تحتاج لتفعيل xp_cmdshell فى sql server استخدم الكود التالى
-- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature. RECONFIGURE GO
نفس السطر يمكنك اضافته للحذف والتعديل
فى التطبيق نضيف fileSystemWatcher
والذى يقوم بمراقبة الملف النصى ونقوم باقتناص الحدث Changed للملف والذى يعنى ان الجدول حصل به تغيير وعليه نقوم بجلب البيانات من الجدول واسنادها لللاداه listbox
خصائص fileSystemWatcher
// fileSystemWatcher1
//
this.fileSystemWatcher1 = new System.IO.FileSystemWatcher();
this.fileSystemWatcher1.EnableRaisingEvents = true;
this.fileSystemWatcher1.Filter = "test.txt";
this.fileSystemWatcher1.Path = "C:\\";
this.fileSystemWatcher1.SynchronizingObject = this;
this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed);انشى تطبيق وعليه listbox و button و fileSystemWatcher
الكود كالتالى: لاحظ عند النقر والاضافه يتم تحديث listbox بناء على الحدث fileSystemWatcher1_Changed
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
using System.Security.Permissions;
namespace Notification
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SqlConnection cnn = new SqlConnection("Data Source=...\\SQL2012;Initial Catalog=Test;Integrated Security=True");
private DataSet ds = new DataSet();
private void Form1_Load(object sender, EventArgs e)
{
GetData();
}
private void GetData()
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM T1", cnn))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
ds.Clear();
da.Fill(ds);
listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = "Name";
}
}
}
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "usp_Add";
cmd.Connection = cnn;
cmd.Parameters.AddWithValue("@name", "new nam");
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}
private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
{
GetData();
}
}
}اخيرا fileSystemWatcher يمكنه مراقبة ملفات على الشبكة
تم تعديل هذه المشاركة بواسطة SOLO.NET في 23 فبراير 2014 في 03:22
VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

SOLO.NET كتب:
السلام عليكم
هل التطبيق على نفس الجهاز ولمستخدم واحد....اذا كان كذلك فما عليك الا اعادة تعبئة listbox
اذا كنت تقصد تعديل البيانات من خارج التطبيق...اسهل سيناريو هو استخدام الاجراءات المخزنه للاضافة.التعديل. الحذف...
واضافة الكود التالى بعد كل عمليه فى الاجراء المخزن..... بحيث ننشئ ملف نصى وفى كل مرة نضيف او نعدل فى الجدول يقوم باضافة نص للملف ومن ثم يتم مراقبته من خلال التطبيق ومعرفة ان بيانات الجدول تعدلت
لنفرض ان لدينا قاعدة بيانات Test وتحوى الجدول T1
USE [Test] GO /****** Object: Table [dbo].[T1] Script Date: 2/23/2014 2:03:34 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T1]( [id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GOالاجراء المخزن التالى للاضافة
USE [Test] GO /****** Object: StoredProcedure [dbo].[usp_Add] Script Date: 2/23/2014 2:04:47 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROCEDURE [dbo].[usp_Add] -- Add the parameters for the stored procedure here @name nvarchar(50) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here INSERT INTO [dbo].[T1] ([Name]) VALUES (@name) execute xp_cmdshell 'echo DataChanged >>c:\test.txt' ENDلاحظ هذا السطر execute xp_cmdshell 'echo DataChanged >>c:\test.txt'
حيث يقوم باضافة عبارة datachanged الى ملف نصى text.txt فى المسار c:
ربما تحتاج لتفعيل xp_cmdshell فى sql server استخدم الكود التالى
-- To allow advanced options to be changed. EXEC sp_configure 'show advanced options', 1 GO -- To update the currently configured value for advanced options. RECONFIGURE GO -- To enable the feature. EXEC sp_configure 'xp_cmdshell', 1 GO -- To update the currently configured value for this feature. RECONFIGURE GOنفس السطر يمكنك اضافته للحذف والتعديل
فى التطبيق نضيف fileSystemWatcher
والذى يقوم بمراقبة الملف النصى ونقوم باقتناص الحدث Changed للملف والذى يعنى ان الجدول حصل به تغيير وعليه نقوم بجلب البيانات من الجدول واسنادها لللاداه listbox
خصائص fileSystemWatcher
// fileSystemWatcher1 // this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); this.fileSystemWatcher1.EnableRaisingEvents = true; this.fileSystemWatcher1.Filter = "test.txt"; this.fileSystemWatcher1.Path = "C:\\"; this.fileSystemWatcher1.SynchronizingObject = this; this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed);انشى تطبيق وعليه listbox و button و fileSystemWatcher
الكود كالتالى: لاحظ عند النقر والاضافه يتم تحديث listbox بناء على الحدث fileSystemWatcher1_Changed
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; using System.Security.Permissions; namespace Notification { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private SqlConnection cnn = new SqlConnection("Data Source=...\\SQL2012;Initial Catalog=Test;Integrated Security=True"); private DataSet ds = new DataSet(); private void Form1_Load(object sender, EventArgs e) { GetData(); } private void GetData() { using (SqlCommand cmd = new SqlCommand("SELECT * FROM T1", cnn)) { using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { ds.Clear(); da.Fill(ds); listBox1.DataSource = ds.Tables[0]; listBox1.DisplayMember = "Name"; } } } private void button1_Click(object sender, EventArgs e) { SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "usp_Add"; cmd.Connection = cnn; cmd.Parameters.AddWithValue("@name", "new nam"); cnn.Open(); cmd.ExecuteNonQuery(); cnn.Close(); } private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e) { GetData(); } } }اخيرا fileSystemWatcher يمكنه مراقبة ملفات على الشبكة
شكراً لحضرتك علي الاهتمام ... ربما سأستخدم هذه الطريقة قريباً حيث انني ينقصني الكصير في برمجة نظام يعمل من خارج الجهاز ....
ولكن اذا كان التطبيق علي نفس الجهاز كيف اعيد تعبئة listbox ؟
بنفس الطريقه التى تم جلب البيانات list box اول مرة بعد كود الاضافه او انشاء اجراء مثل الكود السابق GetData()
namespace Notification
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SqlConnection cnn = new SqlConnection("Data Source=...\\SQL2012;Initial Catalog=Test;Integrated Security=True");
private DataSet ds = new DataSet();
private void Form1_Load(object sender, EventArgs e)
{
GetData();
}
private void GetData()
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM T1", cnn))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
ds.Clear();
da.Fill(ds);
listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = "Name";
}
}
}
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "usp_Add";
cmd.Connection = cnn;
cmd.Parameters.AddWithValue("@name", "new nam");
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
//Refill ListBox from DB
GetData();
}
}
}VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

اه فهمت اخي الكريم .. اعتقدت ان هناك امر يجعل listbox يعيد ربط نفسه بقاعدة البيانات ..
استخدمت هذا الكود ولكن لم يصلح .. النتيجة ان القيمة الموجودة سابقاً ( الواقف عليها ) يستبدلها بالقيمة الجديدة فقط
string JSS_connetionString006 = null;
OleDbConnection JSS_cnn006;
OleDbCommand JSS_cmd006;
string JSS_sql006 = null;
OleDbDataReader JSS_reader006;
JSS_connetionString006 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/je_salestoredb.mdb;Persist Security Info=True;Jet OLEDB:Database Password=JE2014";
JSS_sql006 = "select * from product_groups";
JSS_cnn006 = new OleDbConnection(JSS_connetionString006);
try
{
JSS_cnn006.Open();
JSS_cmd006 = new OleDbCommand(JSS_sql006, JSS_cnn006);
JSS_reader006 = JSS_cmd006.ExecuteReader();
while (JSS_reader006.Read())
{
listBox1.Text = (JSS_reader006.GetValue(1) + "");
}
JSS_reader006.Close();
JSS_cmd006.Dispose();
JSS_cnn006.Close();
}
catch (Exception ex)
{
}استبدل هذا السطر
listBox1.Text = (JSS_reader006.GetValue(1) + "");
بهذا
listBox1.Items.Clear(); listBox1.BeginUpdate(); listBox1.Items.Add (JSS_reader006.GetValue(1) ); listBox1.EndUpdate();
تم تعديل هذه المشاركة بواسطة SOLO.NET في 23 فبراير 2014 في 18:43
VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

SOLO.NET كتب:
استبدل هذا السطر
listBox1.Text = (JSS_reader006.GetValue(1) + "");بهذا
listBox1.Items.Clear(); listBox1.BeginUpdate(); listBox1.Items.Add (JSS_reader006.GetValue(1) ); listBox1.EndUpdate();
للأسف اخي الكريم نفس المشكلة يتم استبدال اول سطر في listbox بالقيمة الجديدة ولا تظهر مضبوطة الا بعد غلق وفتح الفورم
string JSS_connetionString006 = null;
OleDbConnection JSS_cnn006;
OleDbCommand JSS_cmd006;
string JSS_sql006 = null;
OleDbDataReader JSS_reader006;
JSS_connetionString006 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/je_salestoredb.mdb;Persist Security Info=True;Jet OLEDB:Database Password=JE2014";
JSS_sql006 = "select * from product_groups";
JSS_cnn006 = new OleDbConnection(JSS_connetionString006);
try
{
JSS_cnn006.Open();
JSS_cmd006 = new OleDbCommand(JSS_sql006, JSS_cnn006);
JSS_reader006 = JSS_cmd006.ExecuteReader();
listBox1.Items.Clear();
listBox1.BeginUpdate();
while (JSS_reader006.Read())
{
listBox1.Items.Add (JSS_reader006.GetValue(1) );
}
listBox1.EndUpdate();
JSS_reader006.Close();
JSS_cmd006.Dispose();
JSS_cnn006.Close();
}
catch (Exception ex)
{
}الكود كاملا.....
listBox1.Items.Clear(); listBox1.BeginUpdate(); قبل While listBox1.EndUpdate(); بعد حلقة ًwhile
تم تعديل هذه المشاركة بواسطة SOLO.NET في 23 فبراير 2014 في 19:52
VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

لا جديد وتقريباً هناك خطأ ما حيث ان في الـ debugger
يقفز من السطر listBox1.Items.Clear();
الي السطر catch (Exception ex)
ويتجاهل ما بينهم
قم بعرض الخطأ عن طريق messagebox لتعرف ما هو
catch (Exception ex)
{
MessageBox.Show(ex.Message).
}VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

items collection cannot be modified when the datasource property is set
بما انك قمت باسناد مصدر بيانات لل listbox فعليك تعبئة البيانات من خلاله......
هناك جزء ناقص بالكود
هل قمت باسناد Dataset او DataTable لل ListBox.DataSource
اذا كان كذلك فما الجدوى من الكود السابق...........................
VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

على كل حال جرب اضافة خذا السطر قبل While
ListBox1.DataSource=null;
VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

SOLO.NET كتب:
على كل حال جرب اضافة خذا السطر قبل While
ListBox1.DataSource=null;
نفس الخطأ
items collection cannot be modified when the datasource property is set
عموماً انا اعرف انني تعبت حضرتك معاي واضعت من وقتك الكثير .. شكراً لك
كيفية اعادة تعبئة البيانات من خلال مصدر البيانات ؟؟
مرفق مثال بالطريقتين
كود المثال
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
namespace RefillListBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\DB.accdb";
private OleDbConnection cnn = null;
private DataSet ds = new DataSet();
private void GetData()
{
listBox1.BeginUpdate();
if (radioButton1.Checked)
{
ds.Clear();
cnn = new OleDbConnection(ConnectionString);
using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM T1", cnn))
{
da.Fill(ds);
listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = "Na";
}
}
else
{
listBox1.DataSource = null;
listBox1.Items.Clear();
OleDbDataReader dr;
using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM T1", cnn))
{
cnn.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add(dr.GetString(1));
}
cnn.Close();
}
}
listBox1.EndUpdate();
}
private void Form1_Load(object sender, EventArgs e)
{
GetData();
}
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text.Length!=0) using (OleDbCommand cmd=new OleDbCommand("INSERT INTO T1(NA)VALUES('" + textBox1.Text+ "')",cnn))
{
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}
GetData();
}
}
}VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

تم التطبيق بنجاح ... شكراً شكراً شكراً
اذا كنت تستخدم DataBinding فاجعل عمليه تعبئة البيانات بواسطة DataSet فقط
private void Form1_Load(object sender, EventArgs e)
{
GetData();
textBox1.DataBindings.Add("Text", ds.Tables[0], "Na");
}VB.NET and C# Comparison
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده
