Jag skriver en tre-skiktad databaslösning där jag vid flera tillfällen vill fylla en ComboBox med värden. Funktionen ComboBox.Items.Add(string) fungerar bra när jag testar den i t.ex. en vanlig knapp, men när jag instantierar mitt formulär och anropar en egen funktion för att hantera ComboBoxen fungerar det inte. Kan någon hjälpa mig med detta? //M Vill du visa koden på vilket sätt du anropar, och hur din class ser ut. Jag har inte koden på min dator just nu men ungefär så här: om antalet är rätt så testa att kalla på comboboxens Refresh metod... så skall du tvinga den att rita om sig. kolla om det löser problemet. Jag har testat att göra en refresh, men det verkar inte fungera. Antalet poster kan heller inte vara problemet eftersom jag kör mot en testdatabas med enbart 10 poster i. Får du nåt exception? Du har tolkat mig helt rätt. Antalet poster stämmer och om jag skriver ut dem i konsollen så stämmer de. Hur gör jag för att kolla i Items efter posterna? Jag är ganska ny i C# så du får ursäkta min okunskap :-) ok, men då kan vi ju iallafall konstatera att det är det grafiska som inte uppdaterar sig. Jag skall testa att debugga och se vad jag får fram. Tack för din hjälp! ja, det blir en snyggare lösning om du låter gui:et hämta allt från mellanlagret som i sin tur bara kommunicerar mot databasen. På så sätt får du en struktur som är lättare att ändra i, underhålla och byta ut komponenter i. Finns det ingen invändning mot antalet publika variabler i en sådan lösning? Har jag missat något när jag försöker minimera antalet publika variabler i min kod? tja, det bästa är ju att använda sig av properties och publika metoder istället för att exponera publika variabler. då har du mer kontroll över vad som händer med dina variabler. Jag använder mig stort sett aldrig av publika variabler men väldigt ofta av properties. Men du borde väl klara dig med att t.ex. returnera dina rader istället i publik metod, om du inte vill lagra dem i en variabel ifall fler skall använda samma. Allting hänger ju på hur man vill designa och vilket syfte man har... Kan detta hjälpa? Publika variabler är ju en genväg, man spar ju in en hel del kod, men i förlängningen kanske properties är en bra väg att gå. Tack för det. Jag skall jämföra med min kod och begrunda Genom att exponera en variabel publikt kan du ju aldirg vara säker på vad den innehåller. om du däremot har properties kan du t.ex. köra vissa kontroller av vad variablen får innehålla, dessutom kan du ju t.ex. bara exponera en propertie som readonly vilket gör att nån annan bara kan läsa men inte sätta, kan vara behändigt när man inte vill att nån skall "talla" på ens variabler... Man vill ju aldrig att någon skall "talla" på ens variabler :-). Man vill ju aldrig att någon skall "talla" på ens variabler. Jag menade inte att lite kod är bra kod. Jag tycker verkligen att läsbarhet och återanvändbarhet är två viktiga faktorer att beakta.Problem med ComboBox.Items.Add() i C#
Sv: Problem med ComboBox.Items.Add() i C#
Sv: Problem med ComboBox.Items.Add() i C#
FRÅN MELLANSKIKTET:
//Kopplingar till DB och annat
foreach(rad in rader){
frmMittFörstaFormulär.laddaCombo("sträng som innehåller första posten i DB");
}
I FORMULÄRET frmMittförstaFormulär:
//Instantiering av mellanskiktsklassen och anrop av den funktion som hämtar data i DB
public void laddaCombo(string s){
cboCombo.Items.Add(s);
}
Hoppas du förstår lite vad jag menar. Jag har testat med att skriva ut strängen i funktionen laddaCombo och jag får över rätt data. När jag räknar posterna i comboboxen (cboCombo.Items.Count.ToString()) så får jag fram rätt antal poster, men de visas helt enkelt inte i comboboxen. Jag har testat samma sak med en lista eller textfält men inget av det fungerar.
Har du någon idé eller alternativ lösning?
//MSv: Problem med ComboBox.Items.Add() i C#
Om du lägger till väldigt många object borde du nog kolla på beginupdate och endupdate metodernaSv: Problem med ComboBox.Items.Add() i C#
Om man håller sig inom samma klass fungerar det att anropa funktionen. Det är bara när man försöker anropa funktionen från en annan klass som värdena inte vill läggas till. Helskumt!Sv: Problem med ComboBox.Items.Add() i C#
Om jag tolkar dig rätt så innehåller comboboxen rätt antal poster, men de visar sig inte på skärmen? om du kollar i Items finns alla posterna där då? är applikationen multitrådad?
------------
en alternativ lösning är ju att formuläret bara hämtar upp raderna från underliggande lager, vilket jag anser är ett bättre och snyggare alternativ. Detta möjliggör ju att du byter ut gui:et till något annat. Nu är det ju skiktat men inte speciellt generellt...Sv: Problem med ComboBox.Items.Add() i C#
Applikationen kör bara i en tråd.
//M
----
Jag förstår vad du menar med att hämta upp datan från mellanskiktet med en gång. Det kanske är en mer generell och bättre lösning...men man undrar ju vad f-n som är problemet med att göra så här.Sv: Problem med ComboBox.Items.Add() i C#
Använder du vs.net så kan du sätta en breakpoint på nåt bra ställe och göra en watch på din combobox, då kan du välja att titta på Items.
--------------------
jag har testat med ett litet exempel och jag ser inga problem med det du gör egentligen... du får nog kolla över koden lite noggrannare. lägger du till datat i rätt combobox? på rätt instans av formuläret? hur skickar du formuläret till datalagret?
<code>
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Test
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.ComponentModel.IContainer components;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Button button2;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
}
public void AddToCombo(string item)
{
comboBox1.Items.Add(item);
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple;
this.comboBox1.Location = new System.Drawing.Point(16, 24);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(264, 112);
this.comboBox1.TabIndex = 3;
this.comboBox1.Text = "comboBox1";
//
// button2
//
this.button2.Location = new System.Drawing.Point(40, 208);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(96, 48);
this.button2.TabIndex = 2;
this.button2.Text = "BackGround";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(336, 325);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.comboBox1,
this.button2});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
System.Windows.Forms.Application.Run(new Form1());
}
private void button2_Click(object sender, System.EventArgs e)
{
new DataLayer(this).GetRows();
}
}
}
using System;
namespace Test
{
/// <summary>
/// Summary description for DataLayer.
/// </summary>
public class DataLayer
{
Form1 frm;
public DataLayer(Form1 frm)
{
this.frm=frm;
}
public void GetRows()
{
for(int i=0;i<10;i++)
{
frm.AddToCombo(i.ToString());
}
}
}
}
</code>Sv: Problem med ComboBox.Items.Add() i C#
//Mike
- - - - - - - - -
Jag har gjort precis som du visar i koden, men antagligen missat i instatieringen. Jag skall testa att skriva om den, men det lutar nog åt att jag skriver om hela klabbet och hämtar upp allting direkt från mellanlagret. Tack igen för hjälpen!
//MikeSv: Problem med ComboBox.Items.Add() i C#
Lycka till...Sv: Problem med ComboBox.Items.Add() i C#
Sv: Problem med ComboBox.Items.Add() i C#
Sv: Problem med ComboBox.Items.Add() i C#
Jag visar här lite koder som fungerar kanonbra:
<code>
using System.Data;
using System.Data.OleDb;
//****
private OleDbConnection con;
private OleDbDataAdapter da;
private DataSet ds;
//****
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Försäljning.mdb";
con = new OleDbConnection(CONstring);
string s = "SELECT Företagsnamn,Kontaktperson FROM Kunder";
da = new OleDbDataAdapter(s,con);
ds = new DataSet("Kunder");
try
{
con.Open();
da.Fill(ds,"Kunder");
con.Close();
}
catch(Exception fel)
{
MessageBox.Show(fel.Message.ToString());
}
radioButton1.Checked=true;
LaddaListrutan();
//**
private void LaddaListrutan()
{
listBox1.Items.Clear();
string k;
if(radioButton1.Checked==true)
{
k="Företagsnamn";
}
else
{
k="Kontaktperson";
}
int rader = ds.Tables["Kunder"].Rows.Count;
string s;
for(int i = 0;i < rader; i++)
{
s=ds.Tables["Kunder"].Rows[i][k].ToString();
listBox1.Items.Add(s);
}
}
private void radioButton1_CheckedChanged(object sender, System.EventArgs e)
{
LaddaListrutan();
}
private void listBox1_DoubleClick(object sender, System.EventArgs e)
{
this.Text= listBox1.Text.ToString();
}
</code>
Formuläret består då av en listRuta och två radioButton.
Kanske du kan få någon ide.Sv: Problem med ComboBox.Items.Add() i C#
Jag är förstås intresserad av att skriva ett så effektivt och designmässigt sett tilltalande program som möjligt. Bra att kunna få lite synpunkter på det här sättet.
//MikeSv: Problem med ComboBox.Items.Add() i C#
//MSv: Problem med ComboBox.Items.Add() i C#
Lite kod är oftast inte lika med bra kod, oftare är det faktiskt tvärtom, speciellt ur ett återanvändbarhetssyfte och läsbarhetssyfte...Sv: Problem med ComboBox.Items.Add() i C#
Jag menade verkligen inte att lite kod är bra kod. Jag håller helt med dig om att läsbarheten och återanvändbarheten är två viktiga aspekter.
Nu skall jag skriva lite kod och tackar så mycket för visat intresse.
/MikeSv: Problem med ComboBox.Items.Add() i C#
Jag menade verkligen inte att lite kod är bra kod. Jag håller helt med dig om att läsbarheten och återanvändbarheten är två viktiga aspekter.
Nu skall jag skriva lite kod och tackar så mycket för visat intresse.
//MikeSv: Problem med ComboBox.Items.Add() i C#
Nu skall jag skriva om programmet så jag tackar så mycket för visat intresse.
//Mike