2016-10-11 14 views
0

моего первого вопроса на 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 находится в групповом поле, а список - нет, но это не имеет никакого значения.

+0

У меня похоже, что он работает с наличием списка, заполненного списком вместо источника данных: Список > 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

ответ

0

решаемые его с помощью Реза Aghaeis ответ на Get the value for a listbox item by index

public static class ListControlExtensions 
    { 
     public static object GetItemValue(this ListControl list, object item) 
     { 
      if (item == null) 
       throw new ArgumentNullException("item"); 

      if (string.IsNullOrEmpty(list.ValueMember)) 
       return item; 

      var property = TypeDescriptor.GetProperties(item)[list.ValueMember]; 
      if (property == null) 
       throw new ArgumentException(
        string.Format("item doesn't contain '{0}' property or column.", 
        list.ValueMember)); 
      return property.GetValue(item); 
     } 
    } 

//......................................... 

    void cmdGetPCs() 
    { 
     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....) 

     OleDbDataAdapter da = new OleDbDataAdapter(); 
     DataSet ds = new DataSet(); 

     vcon.Open(); 
      da.SelectCommand = new OleDbCommand(q, vcon); 
     vcon.Close(); 

     da.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
     da.Fill(ds, "tblPCs"); 
     DataTable dtPC = ds.Tables["tblPCs"]; 

     foreach (DataRow dtRow in dtPC.Rows) 
     { 
      lstPCs.Items.Add(new KeyValuePair<String, String>(dtRow["LONGDESCR"].ToString(), dtRow["MAC"].ToString())); 
     } 
     lstPCs.DisplayMember = "Key"; 
     lstPCs.ValueMember = "Value"; 
    } 

//......................................... 
    private void Dataset_get(string mymac) 
    { 
     string qp = ""; 
     switch (mypermissions) 
     { 
      case "ADMIN": 
       qp = "SELECT USER_TYPE, HAS_ADMIN, USER_NAME, PASSWORD 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 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; 
     } 

     OleDbDataAdapter dapass = new OleDbDataAdapter(); 
     DataSet dspass = new DataSet(); 
     vcon.Open(); 
      dapass.SelectCommand = new OleDbCommand(qp, vcon); 
     vcon.Close(); 

     dapass.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
     dapass.Fill(dspass,"tblPass"); 
     DataTable dtPass = new DataTable(); 
     dtPass = dspass.Tables["tblPass"]; 
     dataGridView1.DataSource = dtPass; 
    } 
//......................................... 
    void ListBox1SelectedIndexChanged(object sender, EventArgs e) 
    { 
     groupBox1.Text = lstPCs.GetItemText(lstPCs.SelectedItem); 
     string x = lstPCs.GetItemValue(lstPCs.SelectedItem).ToString(); 
     Dataset_get(x); 
    } 

OleDbConnection VCON разделяется.

 Смежные вопросы

  • Нет связанных вопросов^_^