Šta je novo?

Pomoc - WPF aplikacija

  • Začetnik teme Začetnik teme JovBre
  • Datum pokretanja Datum pokretanja

JovBre

Cenjen
Učlanjen(a)
07.04.2012
Poruke
6
Poena
151
Pozdrav svima. Pocetnik sam u programiranju i stvarno bih bila zahvalna na pomoci, sto pre to bolje 🙂
Imam zadatak da se kreira WPF aplikacija (C#) za aukcijsku prodaju. Napravila sam SQL bazu i imam u aplikaciji listbox koji prikazuje sve aukcije i textbox koji pokazuje cenu odabrane aukcije. To je nazalost sve sto sam sama uspela..
Potrebno je jos:
1) da ubacim neki tajmer koji ce u intervalu od jedne sekunde vaditi iz baze sve aktuelne aukcije i prikazati ih u listboxu i
2) kada korisnik klikne na neku stavku iz liste, da se poveca cena proizvoda na koji je kliknuo.

Evo sta sam do sad uradila, nadam se da ce neko moci sto detaljnije da mi objasni i pokaze nekim kodom sta i kako dalje..

MainWindow.xaml
Kod:
 <Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="236" Width="525">
    <Grid Height="199">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="476*" />
            <ColumnDefinition Width="27*" />
        </Grid.ColumnDefinitions>
        <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Height="132" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" Grid.ColumnSpan="2">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=NazivAukcije}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox Text="{Binding Path=Cena}" Height="23" HorizontalAlignment="Left" Margin="12,160,0,0" Name="textBox1" VerticalAlignment="Top" Width="479" Grid.ColumnSpan="2" />
    </Grid>
</Window>


MainWindow.xaml.cs
Kod:
namespace WpfApplication8
{
 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable aukcijeTable = new DataTable();
            SqlConnection conn = new SqlConnection(@"data source=.\jovana;database=aukcije;integrated security=true;");
            SqlDataAdapter aukcDa = new SqlDataAdapter("select * from aukcije", conn);
            aukcDa.Fill(aukcijeTable);
            listBox1.DataContext = aukcijeTable;
            textBox1.DataContext = aukcijeTable;
         }
       
        }

    }


Hvala unapred!
 
Kapiram da znas sta hoces, pa necu previse u detalje 😀 .

Tajmer resavas sledecim kodom:
Kod:
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}
Kreiras Timer objekat koji otkucava na TimeSpan koji podesis. Ovaj red gde je += operator je dodela funkcije koja ce biti pozvana kada timer otkuca. Mozes na ovaj nacin dodeliti vise funkcija, sve dok one zadovoljavaju uslov da imaju kao argumente object i EventArgs. U tvom slucaju, funkcije ce puniti listu cime vec.

Dovrsio bih post i u vezi liste, ali moram da zbrisem 😀
 
Hvala, probacu da iskoristim to, ako ne uspem javljam se. Ako neko ima vremena malo da mi pomogne i oko 2. dela, bilo bi lepo 🙂
Pozdrav
 
Da dovrsim sta sam imao, u ovoj funkciji dispatcherTime_tick jednostavno stavi da ti se stvari kopiraju iz dataTable u njega.

Dvoklikom na listbox ce ti sam Visual Studio generisati funkciju koja ce biti nesto tipa "selection changed". U toj funkciji definises sta ce se desiti kada se promeni selektovani item iz liste. Selektovanim itemima pristupas sa
listbox.selecteditem ili listbox.selectedindex. Itemi su ti u listbox.items, koji je i enumerable tj. mozes ga obilaziti sa foreach, najkrace 😀 .

Ovo ce ti biti bitan resurs:
http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.aspx

Imaces jedan problem, verujem. A to je kada na svaki sekund punis listu, selected item ce se menjati i komponenta ce se ponovo iscrtati. To moze dovesti do flickera i korisnik nece moci lepo da klikne na nesto u listi, jer se moze desiti da se pogled promeni neposredno pre klika ili neposredno posle klika, sto dovodi do frustracije. Tako da ti predlazem, kao najlakse resenje, da malo povecas vreme na koje ce ti program podatke u bazu, ili da se menjaju samo kada ima potrebe.
 
nije presudno ali postavi DataContext na grid-u, umesto na svaku od kontrola posebno

<Grid Height="199" Name="grid">

grid.DataContext = aukcijeTable;
 
Pocetnik sam i mucim i dalje nazalost..
kad ubacim u EventHandler
Kod:
 private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
          SqlCommandBuilder cb = new SqlCommandBuilder(aukcDa);
           aukcDa.Update(aukcijeTable);
           Console.WriteLine("Aukcije updated successfully");
           Console.ReadLine()
}
aukcDa i aukcijeTable does not exist in current context..
sta jos treba koristiti da bi prepoznao ovo kako treba? znam da je glupost u pitanju:sceptic:, i hvala puno na pomoci.
 
Ti objekti su ti verovatno negde lokalno deklarisrani. Stavi ih kao atribute klase ili nekako da ih i ova funkcija vidi.
 
A sto se tice stavke 2. "kada korisnik klikne na neku stavku iz liste, da se poveca cena proizvoda na koji je kliknuo" zar ne mora da postoji konekcija sa sql bazom koja ce da update-uje cenu, tj. poveca za 1 na klik na stavku u listboxu? ne razumem bas... :/ moze neki primercic kao pomoc?
 
Postavi ceo kod xaml i xaml.cs da vidim sta si uradila i gde je zastalo. Pozzzz
 
Javlja se greska -An unhandled exception of type 'System.ArgumentException' occurred in System.Data.dll
Additional information: No mapping exists from object type System.Data.DataRowView to a known managed provider native type.

Preko sql uskladistene procedure je uradjemo da klikom na selektovani red povecava se cena =cena+1.
Treba negde da povezem listbox1.SelectedValue verovatno sa ValueMember, ali gde i kako? 🙁 */

Isto tako imam problem sto nisam sigurna da timer radi (treba da osvezava listu na 1 sec) dok ne uradim deo sa povecanjem cene.

Evo sta je gotovo za sad:
MainWindow.xaml

Kod:
<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="388" Width="538" >
    <Grid Height="199">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <ListView  IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Height="206" HorizontalAlignment="Left" Margin="20,-19,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" Grid.ColumnSpan="2" >           
                
            <ListView.View>                
                <GridView ColumnHeaderToolTip="Aukcije">
                    <GridViewColumn DisplayMemberBinding="{Binding Path=NazivAukcije}" Header="NazivAukcije" Width="300"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Cena1}"  Header="Cena" Width="150  "/>                    
                </GridView>        
            </ListView.View>
        
          </ListView>
        <TextBlock Height="32" HorizontalAlignment="Left" Margin="-1,-72,0,0" Name="textBlock1" Text="Aukcijska prodaja" VerticalAlignment="Top" Width="517" Grid.ColumnSpan="2" TextAlignment="Center" FontFamily="Verdana" FontSize="18" FontWeight="SemiBold" Foreground="#FF137CF5" />
        
        
    </Grid>
</Window>

i MainWindow.xaml.cs

Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Data.SqlClient;
using System.Timers;
using System.Windows.Threading;

namespace WpfApplication8
{
   
    public partial class MainWindow : Window
    {
             
        public MainWindow()
        {
            InitializeComponent();

            DataTable aukcijeTable = new DataTable();
            SqlConnection conn = new SqlConnection(@"Data Source=\.JOVANA;Initial Catalog=aukcije;Integrated Security=True");
            SqlDataAdapter aukcDa = new SqlDataAdapter("select * from aukcije", conn);
            
            aukcDa.Fill(aukcijeTable);
            listBox1.DataContext = aukcijeTable;
            
        }

          private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
              using (SqlConnection conn = new SqlConnection())
               {
                   conn.ConnectionString =( @"Data Source=\.JOVANA;Initial Catalog=aukcije;Integrated Security=True");
              
                   SqlCommand command = conn.CreateCommand();
                   command.CommandType = CommandType.StoredProcedure;
                   command.CommandText = "uspPovecajCenuArtiklaZaJedan";
                   command.Parameters.AddWithValue("@ArtikLIDe", listBox1.SelectedValue);
                   conn.Open();
                   command.ExecuteNonQuery();
               }                                           
             }

       
        

        private void DispatcherTimer(object sender, RoutedEventArgs e)
        {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
            dispatcherTimer.Start();
        }

       private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
           SqlCommandBuilder cb = new SqlCommandBuilder(aukcDa);
           aukcDa.Update(aukcijeTable);
           Console.WriteLine("Aukcije updated successfully");
           Console.ReadLine();
       }
        
       public SqlDataAdapter aukcDa { get; set; } /*Jel ok ovo? Jer mi nije prepoznavao aukcDa i aukcijeTable, 
        pa mi ovo ponudio da generise. */

       public DataTable aukcijeTable { get; set; }

       
    }
      }

Pozz
 
Kako ti se zovu kolone u DataTable? Po defaultu će dobiti imena kolona iz DataAdapter upita. Znači tebi bi u bazi kolone trebalo da se zovu NazivAukcije i Cena1. Ili promeni binding nazive u ListView.


ListView povezuješ sa DataTable na sledeći način:

listBox1.ItemsSource = aukcijeTable.DefaultView;
 
koliko sam videla po gresci koju mi izbacuje fali SelectedValue binding u listview u xamlu? kako bi tacno trebalo to da izgleda? :trust:
kada stavim SelectedValue="{Binding Path=Cena1,Mode=TwoWay}" i dalje prikazuje istu gresku... uhhh nikako da ukaapiram :/
Kod:
 <ListView SelectedValue="{Binding Path=Cena1,Mode=TwoWay}"  IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}"   Height="206" HorizontalAlignment="Left" Margin="20,-19,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" Grid.ColumnSpan="2" SelectionChanged="listBox1_SelectionChanged">
            <ListView.View>
                <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Aukcije">
                    <GridViewColumn DisplayMemberBinding="{Binding NazivAukcije}" Header="NazivAukcije" Width="300"/>

                    <GridViewColumn DisplayMemberBinding="{Binding Cena1}"   Header="Cena" Width="150  "/>
                </GridView>        
            </ListView.View>
        </ListView>
 
Poslednja izmena:
Probaj ovako:

Kod:
<ListView Height="308" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="251">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=NazivAukcije}" Header="NazivAukcije" Width="100" />
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Cena1}" Header="Cena" Width="100" />
                </GridView>
            </ListView.View>
        </ListView>

Kod:
SqlDataAdapter aukcDa = new SqlDataAdapter("select NazivAukcije, Cena1 from aukcije", conn);
aukcijeTable.Clear();
aukcDa.Fill(aukcijeTable);
listBox1.ItemsSource = aukcijeTable.DefaultView;
 
Nazad
Vrh Dno