Sprawa wygląda tak: W bazie mam dwie tabele, Pracownik i Charakter w pierwszej tabeli kluczem głównym jest IDpracownika oraz jest klucz obcy IDcharakteru. w tabeli Charakter mam klucz główny IDcharakteru oraz kolumny TYP, CECHA1, CECHA2, CECHA3, CECHA4. Na Formie mam Combobox w którym wysiwetla się 16 pozycji z kolumny TYP każda pozycja jest czteroliterowym wyrażeniem np. ISTJ. IDcharakteru tez ma 16 pozycji od 1 do 16. czyli każdy TYP ma swoje ID do tych dwóch kolumn nie będę już nic dodawał. Jak to ma działać: z Comboboxa wybieram TYP w textboxie pojawia się ID tego typu a ponadto wartośc comboboxa czyli to słowo 4-literowe powinno zostac podzielone na cztery znaki i każdy znak przydzielony do nowej zmiennej. Pod comboboxem pojawią się 4 labele które będą wyswietlać zawartość tych czterech zmiennych a obok nich będzie po textboxie do którego będzie wprowadzało się liczby które wyladują w kolumnach CECHA 1 Cecha2 itd. Czyli np zmienne a=I,a z textboxa wartosc wpisana ląduje do Cecha1,b=S a z textboxa wartosc wpisana ląduje do Cecha2 itd.
Na koncu button Zapisz zapisuje zmiany w bazie czyli Pracownik otrzymuje TYP i jego ID oraz wartości 4 cech składowych. Proszę o pomysł jak to wykonać, jeżeli ktoś łaskaw to o kod jestem totalnie zielony a czas goni, mam za małą wiedzę
Może jakoś konkretnie powiedz czego nie wiesz, bo na pewno nikt nie poda Ci gotowego kodu.
jak zapisuje sie do comboboxa - wiesz, jak do labeli, textboxów - też wiesz
jak podzielić ciąg na znaki?
string przyklad = "ala ma kota";
char znak = przyklad[0]; //indeks znaku w ciagu zaczynajac od 0
właśnie chodzi jak by wygladać miała metoda pobierająca element z comboboxa i rozdzielenie elementu na 4 części. By pobrać element jakiej właściwości użyć? Acha i jak zrobic by na początku combobox niemiał żadnej wartości korzystam z funkcji DropDownList i jak otwieram forma to jest tam pierwszy element a chce by było czyste pole przed rozwinięciem listy.
jest tam pierwszy element
Nie bardzo rozumiem... :/ Combobox jest na początku pusty...
By pobrać element jakiej właściwości użyć?
Chodzi ci o "comboBox1.Items[0];"?
rozdzielenie elementu na 4 części
Może precyzyjniej :P
Masz tutaj przykład dzielenia elementu na 4 części :P
string s = (string)comboBox1.Items[0];
if (s.Length < 5) throw new ArgumentException();
string p1 = s.Substring(0, 1);
string p2 = s.Substring(1, 2);
string p3 = s.Substring(2, 3);
string p4 = s.Substring(3, 4);
z tym substring to coś nie tak napisałeś, bo drugi parametr określa ile znaków ma zczytać, a nie odkąd dokąd. lepiej zrobić o tak.
string p1 = s[0].ToString();
string p2 = s[1].ToString();
string p3 = s[2].ToString();
string p4 = s[3].ToString();
Jeżeli mowa o wyciąganiu tylko jednego znaku z ciągu.
Jeżeli ma być ich więcej wtedy używamy Substring(odkad,ile_znakow)
Rzeczywiście, masz rację [soczek] , ale to rozwiązanie i tak jest bez sensu :>
Dlatego wolałbym żeby janowski podał o co mu do... chodzi z tym dzieleniem elementu na 4 części :]
EDIT: z wielkim trudem zrozumiałem chyba wreszcie pierwszy post , i nie rozumiem w czym problem :] Przecież wszystko chyba już jest napisane.
W każdym razie astray miałeś rację, najlepiej to zrobić indeksem jeśli chodzi o jeden znak.
Wykonałem to w ten sposób
public void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
string zmienna = "";
zmienna = comboBox1.SelectedValue.ToString();
char znak1 = zmienna[0];
char znak2 = zmienna[1];
char znak3 = zmienna[2];
char znak4 = zmienna[3];
}
chodzi o to że jak odpalam forma to w okienku comboboxa jest wyświetlona pierwsza pozycja z listy, a chce by było na dzień dobry puste, dodanie do listy pustego elementu o indexie 0 odpada bo elementy comboboxa pobieram z bazy danych i wymuszałoby to zmiane tam a tego niechce. Czy istnieje jakaś właściwość która ten problem załatwia? I druga sprawa myśle prostsza ale że jestem newbie więc: w formie mam dwie metody jak zrobić by w drugiej metodzie uzyskać dostep do zmiennych z pierwszej metody? całość wyglada tak:
namespace HRM_MBTI
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
string zmienna = "";
zmienna = comboBox1.SelectedValue.ToString();
char znak1 = zmienna[0];
char znak2 = zmienna[1];
char znak3 = zmienna[2];
char znak4 = zmienna[3];
}
public void label1_TextChanged(object sender, EventArgs e)
{
label1.Text = znak1;
}
}
}
no i w drugiej metodzie mam błąd: The name 'znak1' does not exist in the current context
http://img22.imageshack.us/img22/645/aaahhs.png
specjalnie dla ciebie zhostowałem obrazek :) Gdzie w tym comboboxie masz jakiś element?
w formie mam dwie metody jak zrobić by w drugiej metodzie uzyskać dostep do zmiennych z pierwszej metody?
Nie da się -.- Chociaz i tak nie rozumiem co ty kombiujesz :D
Zrób tak:
public void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
string zmienna = "";
zmienna = comboBox1.SelectedValue.ToString();
label1.Text = zmienna[0];
label2.Text = zmienna[1];
label3.Text = zmienna[2];
label4.Text = zmienna[3];
}
Dwie uwagi:
1: można zmieniać nazwy komponentów :P label1 i comboBox1 w poważniejszych projektach nie mają racji bytu...
2:
public void label1_TextChanged(object sender, EventArgs e)
{
label1.Text = znak1;
}
[rotfl]
Rada na przyszłość :> : Prostszym sposobem na stworzenie pętli neskończonej i stackOvarflow byłoby
private void Sth()
{
Sth();
}
</quote>
http://img171.imageshack.us/img171/7623/97205954.jpg
chodzi o to że na liście w combo mam 16 pozycji i jak odpalam forma to pierwsza jest już w okienku a chce by okienko combo było puste przed rozwinięciem listy. No i teraz jak sobie zaznacze jakaś pozycje np. ISTJ to label1.Text ma być I label2.Text S kolejny T i ostatni J (nie patrz na nazwy labeli w screenie pozmieniam je ) Twoje rozwiazanie przy kompilacji wywala błąd ECannot implicitly convert type 'char' to 'string'
Twoje rozwiazanie przy kompilacji wywala błąd ECannot implicitly convert type 'char' to 'string'
wystarczy
label1.Text = zmienna[0].ToString();
Dzięki teraz działa. A wymysliłeś coś z tym comboboxem by na początku był pusty? może jakieś clear czy coś?
Zmartwie cię - nie ma takiej metody, albo ja nic o niej nie słyszałem. I nie wiem po co ci ona 0_o. Jeśli chcesz musisz reagować na zdarzenie DropDown i za każdym razem wypełniać. Tak, wiem, czytane z bazy danych...
Proponuję włożyć wszystko do tablicy typu object[], i na każdy dropdown wywoływać combobox.Clear(); i combobox.AddRange(tablica);. Albo jeszcze lepiej, danie sobie spokoju z całm pomysłem i pozostanie przy pierwszym elemencie :D
po prostu dodaj pusty a przy pobieraniu indexu dodaj do niego 1 i po sprawie. Inaczej się nie da.Zrób sobie funkcje pt int PobierzZaznaczonyIndex(){return combobox.selectedIndex--;} i po sprawie.