Hỏi về lỗi truyền data từ SQL, sử dụng combobox

Mấy huynh cho em hỏi lỗi trong code, vì sao dữ liệu truyền từ sql lên combox và hiện ra textbox không khớp với nhau ạ.
vd: chọn combobox truyền từ hàng 1 trong name column sql. Nhưng dữ liệu hiển thị trên textbox lại ở hàng thứ 2 và chọn tiếp thì dữ liệu nhảy hàng rất lộn xộn như hình ạ ??


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.SqlClient;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace comboboxapp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public SimpleMath Formular { get; set; }
        public MainWindow()
        {
            Formular = new SimpleMath()
            {
                Txtcode = 0,
                Txtpieces = 0,
                Txtlayers = 0,
                Txtproductionpieces = 0,
                Txtseccond = 0,
            };
            InitializeComponent();
            DataContext = Formular;
            fillcombobox();
        }


        private void MainWindow_Load(object sender, EventArgs e)
        {

        }
        public void fillcombobox()
        {
            SqlConnection con = new SqlConnection("Data Source=LEAN-22\\SQLEXPRESS;Initial Catalog=LUAT;Integrated Security=True");
            string sql = " select * from comboboxnew ";
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader myreader;
            try
            {
                con.Open();
                myreader = cmd.ExecuteReader();
                while (myreader.Read())
                {
                    string sname = myreader.GetInt32(0).ToString();
                    comboBox1.Items.Add(sname);

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }



        private void ComboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SqlConnection con = new SqlConnection("Data Source=LEAN-22\\SQLEXPRESS;Initial Catalog=LUAT;Integrated Security=True");
            string sql = " select * from comboboxnew where code = '"  +comboBox1.Text+  "';";
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader myreader;
            try
            {
                con.Open();
                myreader = cmd.ExecuteReader();
                while (myreader.Read())
                {
                    string code = myreader.GetInt32(0).ToString();
                    string pieces = myreader.GetInt32(1).ToString();
                    string layers = myreader.GetInt32(2).ToString();
                    string productionpieces = myreader.GetInt32(3).ToString();
                    string seccond = myreader.GetInt32(4).ToString();
                    txtcode.Text = code;
                    txtpieces.Text = pieces;
                    txtlayers.Text = layers;
                    txtproductionpieces.Text = productionpieces;
                    txtseccond.Text = seccond;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public class SimpleMath : INotifyPropertyChanged
        {
            private int txtcode;

            public int Txtcode
            {
                get { return txtcode; }
                set
                {
                    txtcode = value;
                    OnPropertyChanged("A");
                    OnPropertyChanged("Txtcode");

                }
            }
            private int txtpieces;

            public int Txtpieces
            {
                get { return txtpieces; }
                set
                {
                    txtpieces = value;
                    OnPropertyChanged("A");
                    OnPropertyChanged("Txtpieces");

                }
            }
            private int txtlayers;

            public int Txtlayers
            {
                get { return txtlayers; }
                set
                {
                    txtlayers = value;
                    OnPropertyChanged("A");
                    OnPropertyChanged("Txtlayers");

                }
            }
            private int txtproductionpieces;

            public int Txtproductionpieces
            {
                get { return txtproductionpieces; }
                set
                {
                    txtproductionpieces = value;
                    OnPropertyChanged("A");
                    OnPropertyChanged("Txtproductionpieces");

                }
            }
            private int txtseccond;

            public int Txtseccond
            {
                get { return txtseccond; }
                set
                {
                    txtseccond = value;
                    OnPropertyChanged("A");
                    OnPropertyChanged("Txtseccond");

                }
            }
        

            public double A => txtcode - txtlayers;

            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged([CallerMemberName()] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }

        }
    }
}

đầu tiên là debug xem

  • lấy được data chưa.
  • dữ liệu trong dataset như thế nào, có đúng theo ý mình không.
  • coi đổ vô combox được không.
2 Likes

không có lỗi anh ạ, dữ liệu set đúng rồi và đổ vào combobox như hình ạ, chỉ là nhảy lộn xộn không trùng thôi

Bạn cần mô tả lỗi rõ ràng và dễ hiểu hơn. Mình không hiểu ý bạn là gì nữa.

Bạn cần chỉ rõ textbox nào, “hàng thứ 2” là gì ?
Ảnh bạn cung cấp chưa đủ thông tin để thấy “dữ liệu nhảy hàng rất lộn xộn”
Bạn nên bổ sung thêm ảnh data của bạn.

Để nhận được câu trả lời đúng, bạn cần hỏi đúng. Nếu bạn hỏi đúng, có thể sẽ chẳng cần đọc code cũng có thể biết được lỗi do đâu.

1 Like

dạ em nghĩ anh chắc là người giỏi code, vậy anh hổ trợ em nhé em sẽ chụp toàn bộ data table bên dưới.
nhìn design sql chắc a củng hình dung ra được kiểu như combobox em chọn số thứ tự 1 ( tức hàng 1-----------) ----> nhưng dữ liệu lại nhảy hàng thứ 2 và hiển thị lên textbox như trên ảnh chọn code thứ tự hàng 4 mà dữ liệu là hàng 2 ) đây ảnh bao quát luôn ạ: thank !

Mình thấy vấn đề của bạn rồi.

string sql = " select * from comboboxnew where code = '" +comboBox1.Text+ "';"; 
SqlCommand cmd = new SqlCommand(sql, con);

Bạn thử đặt thêm dòng log comboBox1.Text để xem lúc này comboBox1.Text giá trị là gì.

và đừng ngạc nhiên.

4 Likes

có nghĩa là thêm dòng đăng nhập nữa hả anh Lộc ?

string sql = " select * from comboboxnew where code = '" +comboBox1.Text+ "';"; 
SqlCommand cmd = new SqlCommand(sql, con);

Mình không giỏi code bạn ạ, mình chỉ bình luận để đẩy bài thôi, hihi :kissing_heart:

1 Like

Nop,
Bạn có thể thêm như thế này để log giá trị ra.

string sql = " select * from comboboxnew where code = '" +comboBox1.Text+ "';"; 
Console.WriteLine(comboBox1.Text);
MessageBox.Show(comboBox1.Text);
SqlCommand cmd = new SqlCommand(sql, con);

hoặc đặt debug point để quan sát giá trị. Cách debug.

Giải thích 1 chút trong sự kiện SelectionChanged giá trị comboBox1.Text chưa được cập nhật, nó cập nhật sau sự kiện này. Chỉ có comboBox1.SelectedItem thay đổi thôi.
Có nhiều giải pháp, trong đó có.

string sql = " select * from comboboxnew where code = '" + comboBox1.SelectedItem + "';"; 
4 Likes

thank anh! để em nghiên cứu

được rồi anh !!!

string sql = " select * from comboboxnew where code = '" +comboBox1.Text+ "';"; 

thay bằng :

string sql = " select * from comboboxnew where code = '" + comboBox1.SelectedItem + "';";

Vậy thì mark as solution.

1 Like

vâng anh sẵn cho em hỏi luôn trong đoạn code em có khai báo các textbox là int = 0 và sử dụng các textbox đó để tính toán luôn show ra 1 textbox như hình nhưng vẫn chưa được nó gán luôn giá trị của text kết quả là 0 ?

code XAML :

<Window x:Class="comboboxapp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:comboboxapp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Label Content="code" HorizontalAlignment="Left" Margin="38,52,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <Label Content="pieces" HorizontalAlignment="Left" Margin="38,126,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <Label Content="layers" HorizontalAlignment="Left" Margin="38,196,0,0" VerticalAlignment="Top" Width="46" Height="30"/>
        <Label Content="production pieces" HorizontalAlignment="Left" Margin="0,278,0,0" VerticalAlignment="Top" Width="108" Height="25"/>
        <TextBox x:Name="txtcode" Text="{Binding txtcode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,52,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtpieces" Text="{Binding txtpieces, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,133,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtlayers" Text="{Binding layers,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,203,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtproductionpieces" Text="{Binding txtproductionpieces,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,280,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <ComboBox x:Name="comboBox1" HorizontalAlignment="Left" Margin="418,52,0,0" VerticalAlignment="Top" Width="319" Height="36" SelectionChanged="ComboBox1_SelectionChanged"/>
        <TextBox x:Name="txtseccond" Text="{Binding txtseccond,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,345,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <Label Content="seccond" HorizontalAlignment="Left" Margin="38,345,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <TextBlock Text="{Binding A, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="418,133,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Height="23" Width="248"/>
        <TextBox Text="{Binding No1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="21" Margin="426,210,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="303"/>
    </Grid>
</Window>

Trong xaml bạn khai báo TextBox với thuộc tính Text = Binding, nhưng trong code C# thuộc tính Text đã thay đổi, không còn Binding đến data nữa.

txtpieces.Text = pieces;
txtlayers.Text = layers;
txtproductionpieces.Text = productionpieces;
txtseccond.Text = seccond;

Dù cơ chế binding twoway là khi view binding với model, nhưng ở những dòng trên bạn đã xóa bỏ binding ấy và thay giá trị Text bằng giá trị mới.

Lý tưởng là: bạn chỉ nên thay đổi Model trong code.
Ngoài ra, khi binding, chỉ binding được vào public property.
Combobox chọn ID của bạn cũng nên thay bằng binding. Tham khảo link dưới

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-bind-to-a-collection-and-display-information-based-on-selection

4 Likes

dạ đoạn này

txtpieces.Text = pieces;
txtlayers.Text = layers;
txtproductionpieces.Text = productionpieces;
txtseccond.Text = seccond;

thì em đã hiểu cơ chế mình sai rồi.
còn ý sau anh nói thật sự em chưa hiểu ạ, em dỡ mà haha nhờ anh khai hộ em !!
( Lý tưởng là: bạn chỉ nên thay đổi Model trong code.
Ngoài ra, khi binding, chỉ binding được vào public property.
Combobox chọn ID của bạn cũng nên thay bằng binding. Tham khảo link dưới

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-bind-to-a-collection-and-display-information-based-on-selection

xong cái này là khỏe rồi, áp dung được nhiều anh Lộc ơi!

bạn chỉ nên thay đổi Model trong code

Tức là bạn set binding trong xaml

<!--xaml-->
 <TextBox x:Name="txtcode" Text="{Binding 
txtcode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />

Thì chỉ set giá trị

txtcode = "New value";

mà không set giá trị trực tiếp vào Textbox.

khi binding, chỉ binding được vào public property.

trong code C#

 private int txtcode;

 public int Txtcode
 {
    get { return txtcode; }
    set
    {
         txtcode = value;
         OnPropertyChanged("A");
         OnPropertyChanged("Txtcode");
    }
}

txtcode là private property còn Txtcode là public property. Bạn chỉ có thể binding vào Txtcode

Combobox chọn ID của bạn cũng nên thay bằng binding

Chắc bạn tự tìm hiểu được.

4 Likes

kết quả như này sao anh Lộc :slight_smile:

code : xaml

<Window x:Class="comboboxapp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:comboboxapp1"
        
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    
    <Grid>
        <Label Content="code" HorizontalAlignment="Left" Margin="38,52,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <Label Content="pieces" HorizontalAlignment="Left" Margin="38,126,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <Label Content="layers" HorizontalAlignment="Left" Margin="38,196,0,0" VerticalAlignment="Top" Width="46" Height="30"/>
        <Label Content="production pieces" HorizontalAlignment="Left" Margin="0,278,0,0" VerticalAlignment="Top" Width="108" Height="25"/>
        <TextBox x:Name="txtcode" Text="{Binding Txtcode, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,52,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtpieces" Text="{Binding Txtpieces, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,133,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtlayers" Text="{Binding Txtlayers,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,203,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <TextBox x:Name="txtproductionpieces" Text="{Binding Txtproductionpieces,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="23" Margin="124,280,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <ComboBox x:Name="comboBox1" Text="{Binding combobox1, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="418,52,0,0" VerticalAlignment="Top" Width="319" Height="36" SelectionChanged="ComboBox1_SelectionChanged"/>
        <TextBox x:Name="txtseccond" Text="{Binding Txtseccond,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Left" Height="23" Margin="124,345,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="141"/>
        <Label Content="seccond" HorizontalAlignment="Left" Margin="38,345,0,0" VerticalAlignment="Top" Width="46" Height="23"/>
        <TextBlock Text="{Binding A, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Left" Margin="418,133,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Height="23" Width="248"/>
        <TextBox Text="{Binding No1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="21" Margin="426,210,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="303"/>


    </Grid>
</Window>
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?