01/10/2018, 13:50

TextBox.Text không cập nhật giá trị khi chỉnh sửa

Em có 1 chương trình WPF nhỏ như thế này:
XAML

<Window x:Class="ClockAlarm.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:ClockAlarm"
        mc:Ignorable="d" WindowStartupLocation="CenterScreen" FontFamily="Arial" Name="wnd"
        Title="MainWindow" Height="900" Width="1200" Background="#FF2C2C2C" Foreground="White">
    <Grid>
        <Grid Grid.ColumnSpan="3" Margin="0,40,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="100"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <StackPanel Grid.Column="1">
                <TextBlock TextAlignment="Center" FontSize="42" Name="Title">Click vào biểu tượng bên phải để sửa</TextBlock>
                <TextBox  FontSize="42" Name="WriteTitle" Background="#FF919191" Visibility="Collapsed"></TextBox>
            </StackPanel>
            <StackPanel Grid.Column="2">
                <Button Name="EditBtn" Height="50" Click="Edit">
                    <TextBlock FontFamily="Material Icons" FontSize="36" Padding="14,3,14,0" Height="42" Width="62">create</TextBlock>
                </Button>
            </StackPanel>
        </Grid>
    </Grid>
</Window>

Code-behind

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
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;

namespace ClockAlarm
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private DispatcherTimer timer;
        private List<int> time;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Edit(object sender, RoutedEventArgs e)
        {
            WriteTitle.Text = "jkcgb";
            Title.Visibility = Visibility.Collapsed;
            WriteTitle.Visibility = Visibility.Visible;
            ((TextBlock)EditBtn.Content).Text = "done";
            EditBtn.Click += Save;
        }
        private void Save(object sender, RoutedEventArgs e)
        {
            Title.Text = WriteTitle.Text;
            WriteTitle.Visibility = Visibility.Collapsed;
            Title.Visibility = Visibility.Visible;
            ((TextBlock)EditBtn.Content).Text = "create";
            EditBtn.Click += Edit;
        }
    }
}

Nhưng khi em chạy chương trình và thử sửa dòng văn bản trong textbox WriteTitle

Nhưng TextBox WriteTitle giá trị không hề cập nhật, dẫn đến TextBlock Title không hề cập nhật giá trị mà vẫn giữ giá trị jkcgb của WriteTitle khi WriteTitle bị gán giá trị này vào khi trong hàm void Edit

Em đã cố gắng tìm kiếm nguyên nhân nhưng bất lực… Mấy bác có thể giúp em được không ạ! Em cảm ơn!

Tao Không Ngu. viết 16:03 ngày 01/10/2018

Hi Trần Linh.
Theo mình thì do bạn gán sự kiện Click cho button EditBtn. Khi bạn click thì nó luôn gọi sự kiện Ediit sáu đó gọi đến sự kiện Save.
Theo mình bạn chỉ nên đang ký 1 sự kiện Click và thêm một biến trạng thái nữa.

Văn Dương viết 15:58 ngày 01/10/2018

Đã set TextChanged cho WriteText đâu ??

Trần Linh viết 16:06 ngày 01/10/2018

Thế phải đặt code gì vào sự kiện TextChanged để nó thay đổi được ạ? Chã nhẽ WriteTitle.Text = WriteTitle.Text??? Em thực sự không biết phải làm sao, mong bác chỉ rõ???

Trần Linh viết 16:03 ngày 01/10/2018

Thế là sao để nó thay đổi luân phiên 2 sự kiện được ạ? Bác chỉ cho em được không ạ? (Không phải em đang chập chững học lập trình mong bác có thể dành chút thời gian )

Văn Dương viết 15:56 ngày 01/10/2018

Code nó chạy đúng rồi. Để mình giải thích cho cậu hiểu:

Lần đầu ấn vào button. Nó chạy vào hàm Edit và set Text = “jkcgb”. OK. Đồng thời nó đăng ký them hàm Save vào sự kiện click. Cậu hiểu ở đây là nó đăng ký them chứ không phải nó chuyển Click sang hàm Save. Mỗi lần += nó sẽ đăng ký them một hàm, mỗi lần -= nó sẽ gỡ đi một hàm chỉ định.

Lần ấn thứ 2 nó sẽ chạy theo trình tự : Edit -> Save vì nó đã được đăng ký them Save ở lần đầu tiên. Nó set lại Text thành “jkcgb” vì nó có gọi hàm Edit. Tiếp tục nó đăng ký hàm Edit 1 lần nữa.

Các lần sau nó sẽ chạy như sau:

Edit->Save->Edit.
Edit->Save->Edit->Save.
Edit->Save->Edit->Save->Edit

Muốn chạy đúng ý đồ. Trước khi đăng ký them sự kiện cho nút phải gỡ bỏ các sự kiện không liên quan.

private void Edit(object sender, RoutedEventArgs e)
        {
            WriteTitle.Text = "jkcgb";
            Title.Visibility = Visibility.Collapsed;
            WriteTitle.Visibility = Visibility.Visible;
            ((TextBlock)EditBtn.Content).Text = "done";
            EditBtn.Click-=Edit;  /// << Gỡ bỏ sự kiệện Edit ra.
            EditBtn.Click += Save;
        }
        private void Save(object sender, RoutedEventArgs e)
        {
            Title.Text = WriteTitle.Text;
            WriteTitle.Visibility = Visibility.Collapsed;
            Title.Visibility = Visibility.Visible;
            ((TextBlock)EditBtn.Content).Text = "create";
            EditBtn.Click-=Save; // << Gỡ bỏ sự kiện Save ra
            EditBtn.Click += Edit;
        }
Văn Dương viết 15:55 ngày 01/10/2018

Mà đơn giản hơn cậu nên làm thế này với Click của button:

private void EditOrSave(object sender, RoutedEventArgs e){
   Button buton  = (Button)sender;
   string content = (string)button.Content;
   if(content=="done"){
       button.Content = "creat";
       // làm tiếp cái gì đó tương ứng với done                        
   }
   else{
       button.Content = "done";
       // làm tiếp cái gì đó tương ứng với creat
   }
}
Trần Linh viết 16:01 ngày 01/10/2018

Em cảm ơn ^_^! Thì ra là thế! Để em sửa lại xem!

Bài liên quan
0