моего первого вопроса на StackOverflow, так как я не нашел никакого решения пока (?):гр элементы # ListBox заменяется на item.tostring() при наличии два заливки oledbadapter команды
Я работаю на простой пароле который берет данные из MS Access DB (нет надлежащей доступной DB)
БД Access имеет две таблицы. Таблица ПК и дочерняя таблица паролей, связанные через MAC-адрес.
Программа отображает список ключей/значений в списке со всеми именами компьютеров, полученными через oledb.
ключ - имя компьютера, значение - адрес MAC. Это прекрасно работает.
void cmdGetPCs()
{
OleDbDataAdapter daPCs = new OleDbDataAdapter();
OleDbConnection vcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=H:\XXX\XXX\MYACCESSFILE.accdb;Jet OLEDB:Database Password=[REDACTED]");
const string q = "SELECT SISSI & ' (' & IP & ') - ' & DESCRIPTION as LONGDESCR, MAC from PC_LIST WHERE active = true order by sissi, ip"; //use & instead of + to have blankspace instead of null values for displaying PCs without Sissi because CONCAT doesn't work (MS Access....)
vcon.Open();
daPCs.SelectCommand = new OleDbCommand(q, vcon);
vcon.Close();
DataSet dsPC = new DataSet("PCs");
daPCs.MissingSchemaAction = MissingSchemaAction.AddWithKey;
daPCs.Fill(dsPC, "tblPCs");
DataTable dtPC = dsPC.Tables["tblPCs"];
var PCList = new List<PCInfo>();
foreach (DataRow dtRow in dtPC.Rows)
{
PCList.Add(new PCInfo() { LONGDESCR = dtRow["LONGDESCR"].ToString(), MAC = dtRow["MAC"].ToString() });
}
lstPCs.DisplayMember = "LONGDESCR";
lstPCs.ValueMember = "MAC";
lstPCs.DataSource = PCList;
}
Итак, у меня есть список, заполненный описаниями компьютеров. Теперь, когда я выбираю элемент из Listbox У меня есть DataGridView элемент в том же окне, которое должно быть заполнено с Пароль:
void ListBox1SelectedIndexChanged(object sender, EventArgs e)
{
groupBox1.Text = lstPCs.GetItemText(lstPCs.SelectedItem);
string x = lstPCs.GetItemText(lstPCs.SelectedValue);
//Dataset_get(x);
}
Это все еще работает хорошо до тех пор, пока Dataset_get закомментирована. Первая строка отображает видимый ключ поля элемента как заголовок группового поля, а строка x - адрес MAC (= ItemList Value) выбранного элемента.
Как только я активирую Dataset_get (x) и запускаю программу, ListBox заполняется, но все элементы заменяются на places.toString(), которые, похоже, помещаются.
Listbox выглядит как:
- myprogramname.MainForm + PCinfo
- myprogramname.MainForm + PCinfo
- myprogramname.MainForm + PCinfo
- myprogramname.MainForm + PCinfo
- myprogramname .MainForm + PCInfo
- и т. Д.
Первые две строки (groupbox и строка x) индексного обмена все еще работают нормально и отображают правильные значения. Также сам Dataset_get работает нормально и заполняет Datagridview. Так что я могу либо имеет читаемый пользователь окно списка без заполненного DataGrid зрения или сломанного ListBox с заполненной DataGrid зрения ... Очевидно, мне нужно читаемое окно списка с заполненной DataGrid зрения;)
I сузил проблему в Dataset_get к тому, что он начинает ломается, как только заполняющей линия DataGrid извлечения данных представления называется:
private void Dataset_get(string mymac)
{
OleDbDataAdapter daPass = new OleDbDataAdapter();
OleDbConnection vconp = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=H:\XXX\XXX\MYACCESSFILE.accdb;Jet OLEDB:Database Password=[REDACTED]");
string qp = "";
switch (mypermissions)
{
case "ADMIN":
qp = "SELECT USER_TYPE, HAS_ADMIN, USER_NAME, PASSWORD, ID FROM PASSWORDS WHERE ID = '" + mymac + "' ORDER BY user_type";break;
case "USER":
qp = "SELECT p.USER_TYPE, p.HAS_ADMIN, p.USER_NAME, p.PASSWORD, p.ID FROM PASSWORDS p, PC_LIST pc WHERE p.ID = '" + mymac + "' and p.ID = pc.MAC and (pc.x_plant like '%USER%' or (ucase(p.user_type) not like '%ADMIN%')) ORDER BY p.user_type";break;
default: break;
}
vconp.Open();
daPass.SelectCommand = new OleDbCommand(qp, vconp);
vconp.Close();
DataSet dsPass = new DataSet("Passwords");
daPass.MissingSchemaAction = MissingSchemaAction.AddWithKey;
daPass.Fill(dsPass,"tblPass"); //REPLACEMENT OF LIST ITEMS IS TRIGGERED BY THIS LINE
DataTable dtPass = dsPass.Tables["tblPass"];
dataGridView1.DataSource = dtPass;
}
Пожалуйста, помогите мне ... Спасибо заранее!
PS: Datagridview находится в групповом поле, а список - нет, но это не имеет никакого значения.
У меня похоже, что он работает с наличием списка, заполненного списком вместо источника данных: Список> test = new List >(); \t \t \t Еогеасп (DataRow dtRow в dtPC.Rows) \t { \t \t \t \t test.Add (новый KeyValuePair (dtRow [ "LONGDESCR"]. ToString(), dtRow [ "MAC"] .Нанизывать())); } lstPCs.DataSource = test; однако (будьте осторожны: вопрос о нобе): как я могу отображать только ключ в списке вместо [key, value]? –
doomi