を同期するデータベースのテーブルでのListBoxをキープ初めて:私は私のリストボックスを埋める方法は、ときに私のフォームのロードのため、私は私が私のDBから<strong>表</strong>(<em>人</em>)のうち、それを埋める<strong>のListBox</strong>(<em>listContacts</em>)(<em>DB1.mdf</em>)を持っている
class Person
{
public string Id { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
:
private void Initiation()
{
// Fill list:
var DB = new Database();
DataTable Persons = DB.TableFromDB(strMyDBFilePath, "SELECT * FROM Person", "Person");
var listP = new List<Person>() { };
foreach (DataRow dr in Persons.Rows)
//listContacts.Items.Add(dr["Firstname"].ToString().Trim() + " " + dr["Lastname"].ToString().Trim());
listP.Add(new Person()
{
Id = dr["Id"].ToString(),
Firstname = dr["Firstname"].ToString().Trim(),
Lastname = dr["Lastname"].ToString().Trim()
});
listContacts.ItemsSource = listP;
}
class Database
{
public DataTable TableFromDB(string DatabaseName, string Command, string TableName)
{
var da = new SqlDataAdapter();
var ds = new DataSet();
var cs = new SqlConnection(strSQLNetworkInterface + DatabaseName);
da.SelectCommand = new SqlCommand(Command,cs);
da.Fill(ds, TableName);
return ds.Tables[TableName];
}
public void InsertToDB(Person Person, string TableName, string DatabaseName)
{
var da = new SqlDataAdapter();
var ds = new DataSet();
var cs = new SqlConnection(strSQLNetworkInterface + DatabaseName);
da.SelectCommand = new SqlCommand("SELECT * FROM " + TableName, cs);
da.Fill(ds, TableName);
DataRow dr = ds.Tables[TableName].NewRow();
dr["Firstname"] = Person.Firstname;
dr["Lastname"] = Person.Lastname;
ds.Tables[TableName].Rows.Add(dr);
var cb = new SqlCommandBuilder(da);
cb.DataAdapter.Update(ds.Tables[TableName]);
}
}
テーブル(Person)にレコードを追加すると、InsertToDBを使用すると問題なく動作します。次に必要なのは、私の更新することですListBox(listContacts)。私だけではなくでした:
listContacts.Items.Add(pNew.Firstname + " " + pNew.Lastname);
それは、このエラーが発生します。
Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead
は今、私の質問:私のリストボックスを同期保つためのItemsSourceを使用する方法?
編集:キレネンコのヒント@に基づいて
私はこれを追加しました:
var listP = (List<Person>)(listContacts.ItemsSource);
listP.Add(pNew);
listContacts.ItemsSource = listP;
をしかし、それは私ののListBoxを更新していないようです!
'listPacts'ではなく' ListP'に項目を追加してください。 – Jose
@Kirenenkoありがとう。上記のコードをいくつか追加しました。しかしまだ更新していない。 –
MVVMパターンをチェックして、listContacts.ItemSource(ビュー内)をobservableCollection listP(ビューモデル内)にバインドします。 –
Jose