ปลั๊กเสียบ 41คะแนนชื่อเสียง
ได้โปรดฉันต้องการเติมกล่องข้อความและกล่องคำสั่งผสมใน WPF ด้วยข้อมูลจากดาต้ากริดเมื่อผู้ใช้นำทางจากแถวหนึ่งไปยังอีกแถวในดาต้ากริด เมื่อผู้ใช้คลิกที่แถวใดแถวหนึ่ง ระเบียนในแถวนั้นจะบรรจุกล่องข้อความและกล่องคำสั่งผสม ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร
มูลนิธิการนำเสนอ Windows
มูลนิธิการนำเสนอ Windows
ส่วนหนึ่งของ .NET Framework ที่มีรูปแบบการเขียนโปรแกรมแบบรวมสำหรับการสร้างแอปพลิเคชันเดสก์ท็อปสายงานธุรกิจบน Windows
2,363 คำถาม
ค#
ค#
ภาษาการเขียนโปรแกรมเชิงวัตถุและประเภทที่ปลอดภัยซึ่งมีรากฐานมาจากภาษาตระกูล C และรวมถึงการสนับสนุนการเขียนโปรแกรมเชิงส่วนประกอบ
8,171 คำถาม
ลงชื่อเข้าใช้เพื่อติดตาม
0 ความคิดเห็นไม่มีความคิดเห็น
0{count} คะแนน
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
4 คำตอบ
จัดเรียงตาม:ใหม่ล่าสุด
เป็นประโยชน์มากที่สุด ใหม่ล่าสุด เก่าที่สุด
ปีเตอร์ เฟลสเชอร์ (อดีต MVP) 18,381คะแนนชื่อเสียง
2020-12-25T20:50:27.997+00:00 สวัสดี,
หากคุณต้องการใช้ ADO.NET เพื่ออ่านข้อมูลจาก SQL Server คุณสามารถใช้คลาสนี้แทนรหัสอื่นของฉันชั้นเรียน:
การใช้ System, การใช้ System.ComponentModel, การใช้ System.Data, การใช้ System.Data.SqlClient, การใช้ System.Runtime.CompilerServices, การใช้ System.Windows.Data, namespace WpfApp1{ class ViewModel : INotifyPropertyChanged { // ctor เพื่อโหลดข้อมูลสาธิตสาธารณะ ViewModel () { โมเดล mod = โมเดลใหม่ (); // ค้นหาข้อมูล (แสดงรายการใน ComboBox) cvsLookUp.Source = mod.GetLookUp(); // วัตถุข้อมูล (แถว DataGrid) cvsData.Source = mod.GetData(); cvsData.View.CurrentChanged += (ผู้ส่ง, e) => { SelectedObject = cvsData.View.CurrentItem; }; cvsData.View.MoveCurrentToPosition(-1); cvsData.View.MoveCurrentToFirst(); } // DataGrid ดู CollectionViewSource ส่วนตัว cvsData = ใหม่ CollectionViewSource (); ICollectionView ViewData สาธารณะ { รับ { คืน cvsData.View; } } // ComboBox ดู CollectionViewSource ส่วนตัว cvsLookUp = ใหม่ CollectionViewSource (); ICollectionView ViewLookUp สาธารณะ { รับ { ส่งคืน cvsLookUp.View; } } // สำหรับการแสดงรายละเอียดและแก้ไขวัตถุส่วนตัว _selectedObject = null; วัตถุสาธารณะ SelectedObject { รับ => this._selectedObject; ตั้งค่า { this._selectedObject = ค่า; OnPropertyChanged(); } } เหตุการณ์สาธารณะ PropertyChangedEventHandler PropertyChanged; โมฆะส่วนตัว OnPropertyChanged ([CallerMemberName] string propName = "") => PropertyChanged?.Invoke (นี่, PropertyChangedEventArgs ใหม่ (propName)); } โมเดลคลาสภายใน { DataTable GetLookUp ภายใน () { DataTable dt = DataTable ใหม่ (); ใช้ (SqlDataAdapter da = SqlDataAdapter ใหม่ ("เลือก * จาก [Table2]", WpfApp1.Properties.Settings.Default.cnSQL)) da.Fill (dt); กลับ dt; } DataTable ภายใน GetData () { DataTable dt = DataTable ใหม่ (); ใช้ (SqlDataAdapter da = SqlDataAdapter ใหม่ ("เลือก * จาก [Table1]", WpfApp1.Properties.Settings.Default.cnSQL)) da.Fill (dt); กลับ dt; } }}
ในการสร้างตารางเซิร์ฟเวอร์ SQL และกรอกข้อมูลสาธิตคุณสามารถใช้วิธีการต่อไปนี้:
โมฆะภายใน CraeteData () { โดยใช้ (SqlConnection cn = SqlConnection ใหม่ (WpfApp1.Properties.Settings.Default.cnSQL)) { cn.Open (); โดยใช้ (SqlCommand cmd = new SqlCommand { Connection = cn }) { // ลบตารางก่อนหน้าใน SQL Server 2016 และสูงกว่า cmd.CommandText = "วางตารางหากมี Table1; วางตารางหากมี Table2;"; cmd.ExecuteNonQuery(); // Create Table cmd.CommandText = "CREATE Table [Table1]([ID] int Identity, [Info] nvarchar(50), [FK] int, CONSTRAINT [PK_Table1] PRIMARY KEY ([ID]))"; cmd.ExecuteNonQuery(); cmd.CommandText = "สร้างตาราง [Table2]([ID] int Identity, [Text] nvarchar(50), CONSTRAINT [PK_Table2] คีย์หลัก ([ID]))"; cmd.ExecuteNonQuery(); // วัตถุข้อมูล (แถว DataGrid) สุ่ม rnd = ใหม่สุ่ม (); cmd.CommandText = "INSERT [Table1](ข้อมูล, FK) ค่า (@info, @fk);"; cmd.Parameters.Add("@info", SqlDbType.NVarChar, 50); cmd.Parameters.Add("@fk", SqlDbType.Int); สำหรับ (int i = 1; i < 50; i++) { cmd.Parameters["@info"].Value = $"Row {i}"; cmd.Parameters["@fk"].Value = rnd.Next(1, 10); cmd.ExecuteNonQuery(); } // ค้นหาข้อมูล (แสดงรายการใน ComboBox) cmd.CommandText = "INSERT [Table2](Text) VALUES (@text);"; cmd.Parameters.Clear(); cmd.Parameters.Add("@text", SqlDbType.NVarChar, 50); สำหรับ (int i = 1; i < 10; i++) { cmd.Parameters["@text"].Value = $"Lookup-Text {i}"; cmd.ExecuteNonQuery(); } } }}
ปลั๊กเสียบ 41คะแนนชื่อเสียง
2020-12-25T20:56:12.643+00:00 ตกลง. ฉันจะทำงานนี้พรุ่งนี้เช้าเพื่อดูว่าจะนำไปสู่ที่ใด ขอบคุณ
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
ปีเตอร์ เฟลสเชอร์ (อดีต MVP) 18,381คะแนนชื่อเสียง
2020-12-25T08:32:07.647+00:00 สวัสดี,
ลองทำตามการสาธิต ด้านซ้ายของหน้าต่างคุณจะเห็น DataGrid พร้อมแถวสำหรับแต่ละวัตถุข้อมูล ที่ด้านขวา คุณจะเห็นแถวที่เลือก (วัตถุข้อมูล) สำหรับการแก้ไขXAML:
(Video) Visual Studio Code C#: a Web Scraper Tutorial<หน้าต่าง x:Class="WpfApp1.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:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
Grid.Resources> และชั้นเรียน:
ใช้ระบบ; ใช้ System.Collections.ObjectModel; ใช้ System.ComponentModel; ใช้ System.Runtime.CompilerServices; ใช้ System.Windows.Data; เนมสเปซ WpfApp1 { class ViewModel: INotifyPropertyChanged { // ctor เพื่อกรอกข้อมูลสาธิตสาธารณะ ViewModel () { Random rnd = new Random (); // ค้นหาข้อมูล (แสดงรายการใน ComboBox) ObservableCollection
colLookUp = new ObservableCollection (); สำหรับ (int i = 1; i < 10; i++) colLookUp.Add (new LookUpData { ID = i, Text = $"Lookup-Text {i}" }); cvsLookUp.Source = colLookUp; // วัตถุข้อมูล (แถว DataGrid) ObservableCollection colData = ObservableCollection ใหม่(); สำหรับ (int i = 1; i < 50; i++) colData.Add (ข้อมูลใหม่ { ID = i, ข้อมูล = $"Row {i}", FK = rnd.Next(1,colLookUp.Count+1) }) ; cvsData.Source = colData; cvsData.View.CurrentChanged += (ผู้ส่ง, e) => { SelectedObject = cvsData.View.CurrentItem; }; cvsData.View.MoveCurrentToPosition(-1); cvsData.View.MoveCurrentToFirst(); } // DataGrid ดู CollectionViewSource ส่วนตัว cvsData = ใหม่ CollectionViewSource (); ICollectionView ViewData สาธารณะ { รับ { คืน cvsData.View; } } // ComboBox ดู CollectionViewSource ส่วนตัว cvsLookUp = ใหม่ CollectionViewSource (); ICollectionView ViewLookUp สาธารณะ { รับ { ส่งคืน cvsLookUp.View; } } // สำหรับการแสดงรายละเอียดและแก้ไขวัตถุส่วนตัว _selectedObject = null; วัตถุสาธารณะ SelectedObject { รับ => this._selectedObject; ตั้งค่า { this._selectedObject = ค่า; OnPropertyChanged(); } } เหตุการณ์สาธารณะ PropertyChangedEventHandler PropertyChanged; โมฆะส่วนตัว OnPropertyChanged ([CallerMemberName] string propName = "") => PropertyChanged?.Invoke (นี่, PropertyChangedEventArgs ใหม่ (propName)); } // DataGrid data คลาสสาธารณะ Data { public int ID { รับ; ชุด; } ข้อมูลสตริงสาธารณะ { รับ; ชุด; } สาธารณะ int FK { รับ; ชุด; } // ค่าคีย์ต่างประเทศ } // ข้อมูลรายการ ComboBox (ข้อมูลการค้นหา) คลาสสาธารณะ LookUpData { public int ID { รับ; ชุด; } // ข้อความสตริงสาธารณะค่าคีย์ { รับ; ชุด; } // ข้อความที่จะแสดงใน DataGrid (ComboBoxColumn) } } ผลลัพธ์:
ปลั๊กเสียบ 41คะแนนชื่อเสียง
2020-12-25T11:56:24.307+00:00 คุณช่วยอธิบายรหัสนี้หน่อยได้ไหมและฉันต้องการรับข้อมูลจากฐานข้อมูลเซิร์ฟเวอร์ SQL ฉันจะไปเกี่ยวกับเรื่องนั้นได้อย่างไร?
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
เดซี่เทียน-1203 11,511คะแนนชื่อเสียง
2020-12-25T02:36:18.487+00:00 ฉันจะให้ตัวอย่างกับ MVVM เพื่อใช้สิ่งที่คุณต้องการ
ส่วนที่ 1:รหัสสำหรับ MainWindow.xaml
ตอนที่ 2:รหัสสำหรับ MainWindow.xaml.cs
enum สาธารณะ SexOpt { ชาย, หญิง }; PersonModel ระดับสาธารณะ: NotifyObject { ชื่อสตริงส่วนตัว; ชื่อสตริงสาธารณะ { รับ { ชื่อกลับ; } ตั้ง { ชื่อ = ค่า; OnPropertyChange("ชื่อ"); } } อายุ int ส่วนตัว; อายุ int สาธารณะ { รับ { คืนอายุ; } ชุด { อายุ = ค่า; OnPropertyChange("อายุ"); } } เพศส่วนตัว SexOpt; SexOpt Sex สาธารณะ { รับ { คืนเพศ; } ชุด { เพศ = ค่า; OnPropertyChange("เพศ"); } } } คลาส PersonViewModel: NotifyObject { ผู้ใช้ส่วนตัว PersonModel; ผู้ใช้ PersonModel สาธารณะ { รับ { ผู้ใช้ที่ส่งคืน; } ตั้งค่า { ผู้ใช้ = ค่า; OnPropertyChange("ผู้ใช้"); } } ส่วนตัว ObservableCollection
ltPersons = ObservableCollection ใหม่ (); ObservableCollection สาธารณะ LtPersons { รับ { คืน ltPersons; } ตั้งค่า { this.ltPersons = ค่า; OnPropertyChange("บุคคล LtPersons"); } } สาธารณะ PersonViewModel() { LtPersons = ใหม่ ObservableCollection () { ใหม่ PersonModel { ชื่อ = "จอห์น", อายุ = 11, เพศ = SexOpt.Male}, ใหม่ PersonModel { ชื่อ = "จูลี่", อายุ = 12, เพศ = SexOpt.Female} บุคคลใหม่ { ชื่อ = "รั้ง", อายุ = 13 , เพศ = SexOpt.Male} }; } } ระดับสาธารณะ NotifyObject: INotifyPropertyChanged { เหตุการณ์สาธารณะ PropertyChangedEventHandler PropertyChanged; โมฆะที่ได้รับการป้องกัน OnPropertyChange (string propertyName) { ถ้า (PropertyChanged != null) { PropertyChanged (นี่ใหม่ PropertyChangedEventArgs (ชื่อคุณสมบัติ)); } } } รูปภาพสำหรับผลลัพธ์:
หากคำตอบเป็นประโยชน์ โปรดคลิก "ยอมรับคำตอบ" และโหวตให้
หมายเหตุ: โปรดทำตามขั้นตอนในของเราเอกสารเพื่อเปิดใช้งานการแจ้งเตือนทางอีเมล หากคุณต้องการรับการแจ้งเตือนทางอีเมลที่เกี่ยวข้องสำหรับเธรดนี้ปลั๊กเสียบ 41คะแนนชื่อเสียง
(Video) Flutter : GetX fetch data from Api using network call | GetX Api example | getx flutter2020-12-25T12:06:31.437+00:00 ฉันจะใช้สิ่งนี้กับฐานข้อมูลเซิร์ฟเวอร์ SQL เพื่อรับข้อมูลจากฐานข้อมูลโดยเฉพาะเมื่อใช้ SqlDataReader และใช้โค้ดที่อยู่ด้านหลังหน้าแทน MVVM ได้อย่างไร
คาเรน เพย์น MVP 31,001คะแนนชื่อเสียง
2020-12-25T13:24:01.417+00:00 คุณเคยพิจารณาใช้ Entity Framework เพื่ออ่านข้อมูลจากฐานข้อมูลของคุณหรือไม่? สนใจดูบทความ TechNet ต่อไปนี้. ภาพหน้าจอโดยใช้ Entity Frameworkนี่คือที่ที่มีการตั้งค่าข้อมูล. สิ่งนี้สามารถปรับให้เข้ากับการใช้ตัวอ่านข้อมูลและหากเป็น .NET Core คุณต้องเพิ่มไฟล์ .NET Coreแพ็คเกจ SqlClient NuGet.
ปลั๊กเสียบ 41คะแนนชื่อเสียง
2020-12-25T15:19:10.747+00:00 ฉันไม่ใช่แฟนตัวยงของเอนทิตีเฟรมเวิร์ก ฉันชอบดูว่าโค้ดของฉันทำในสิ่งที่ฉันขอให้ทำอย่างไร ฉันชอบเขียนรหัสการเข้าถึงข้อมูลในแบบของฉัน ในลักษณะที่เรียบง่าย ดังนั้นฉันจึงเข้าใจว่าควรเกิดอะไรขึ้นในกรณีที่มีข้อยกเว้น ดังนั้นฉันขอเป็น ADO บริสุทธิ์ได้ไหม สุทธิ?
คาเรน เพย์น MVP 31,001คะแนนชื่อเสียง
2020-12-25T17:36:10.01+00:00 ฉันไม่ใช่แฟนตัวยงของเอนทิตีเฟรมเวิร์ก ฉันชอบดูว่าโค้ดของฉันทำในสิ่งที่ฉันขอให้ทำอย่างไร ฉันชอบเขียนรหัสการเข้าถึงข้อมูลในแบบของฉัน ในลักษณะที่เรียบง่าย ดังนั้นฉันจึงเข้าใจว่าควรเกิดอะไรขึ้นในกรณีที่มีข้อยกเว้น ดังนั้นฉันขอเป็น ADO บริสุทธิ์ได้ไหม สุทธิ?
ฉันสามารถให้สิ่งนั้นได้อย่างแน่นอน แต่ต้องเป็นอย่างหลัง เพราะฉันต้องออกไปทำธุระในวันนี้ หมายเหตุด้านข้างเกี่ยวกับสิ่งที่ฉันทำในบทความ โค้ด Entity Framework เสร็จสิ้นด้วยเครื่องมือพร้อมกับการใช้งาน INotifyPropertyChanged เสร็จสิ้นด้วย Add-in ของ Visual Studio ดังนั้นจึงมีโค้ดจริงให้เขียนน้อยมาก แต่ฉันเข้าใจว่าบางคน ไม่ใช่แฟนของ Entity Framework ในกรณีของฉัน ฉันชอบ Entity Framework เพราะฉันพบว่ามันง่ายกว่าการใช้ ADO.NET และใช้ ADO.NET สำหรับคำถามในฟอรัมเท่านั้น
ปลั๊กเสียบ 41คะแนนชื่อเสียง
(Video) Flutter : GetX Save data using Storage Box | Added Subtitles | getx flutter | flutter coding2020-12-25T19:25:40.687+00:00 ได้โปรดฉันยืนอยู่ข้าง ๆ ฉันยินดีที่จะได้รับจากคุณ ขอบคุณล่วงหน้า.
คาเรน เพย์น MVP 31,001คะแนนชื่อเสียง
2020-12-26T15:50:00.717+00:00 สวัสดี@ดีปลั๊ก
ดูการตอบกลับครั้งแรกของฉันซึ่งฉันได้เพิ่มการแก้ไขเพื่อใช้ DataReader ทิ้งรหัส Entity Framework ไว้ที่นั่น แต่แสดงความคิดเห็นดังนั้นจึงไม่ได้ใช้ Entity Framework
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
คาเรน เพย์น MVP 31,001คะแนนชื่อเสียง
2020-12-24T15:49:15.827+00:00 สวัสดี@ดีปลั๊ก
โปรดทราบว่าสิ่งต่อไปนี้ไม่ใช่โซลูชันปลั๊กอินของโค้ด แต่เป็นเส้นทางที่จะนำคุณไปสู่สิ่งที่คุณต้องการแทน
ฝากติดตามกันด้วยนะครับตัวอย่างโค้ด Microsoft. จากนั้นสำหรับการเริ่มต้นดูต่อไปนี้บทความของเทคเน็ตและรหัสซึ่งไม่มี ComboBox หรือ DataGrid แต่เป็น ListBox แทน อย่าวางสายบน ListBox
ภาพหน้าจอด้านล่างใช้สำหรับบทความ TechNet ละเว้น VB.NET เนื่องจากโค้ดจริงมีหนึ่งโครงการสำหรับ C# และอีกโครงการหนึ่งสำหรับ VB.NET
DataGrid
MainWindow แหล่งแก้ไข
ป้องกันแทนที่ async เป็นโมฆะ OnContentRendered (EventArgs e) { base.OnContentRendered (e); ถ้า (_hasShown) { กลับ; } _hasShown = จริง; var EmployeeCollection = ใหม่ ObservableCollection<พนักงาน>(); //await Task.Run(async () => //{ // excellentCollection = new ObservableCollection
(await _context.Employees.ToListAsync()); //}); รอ Task.Delay(1); EmployeeCollection = ObservableCollection ใหม่ <พนักงาน> (EmployeesOperations.List ()); EmployeeGrid.ItemsSource = คอลเลกชันพนักงาน; EmployeeCollection.CollectionChanged += EmployeeCollection_CollectionChanged; DataContext = คอลเลกชันพนักงาน; /* * ค้นหาพนักงานตามนามสกุล หากพบ * เลือกและเลื่อนเข้าไปดูใน DataGrid */ var Employee = (employeeCollection) .FirstOrDefault(emp => emp.LastName == "Russell"); ถ้า (พนักงาน == null) กลับ; EmployeeGrid.SelectedItem = พนักงาน; EmployeeGrid.ScrollIntoView (พนักงาน); SaveButton.IsEnabled = จริง; } เครื่องอ่านข้อมูล
เพิ่มโค้ดแล้ว ใช้ด้านบน หมายเหตุคลาสส่วนขยาย DbExtensions ควรอยู่ในไฟล์ของตัวเอง
ใช้ระบบ; ใช้ System.Collections.Generic; ใช้ System.Data; ใช้ System.Globalization; ใช้ System.Linq; ใช้ System.Text; ใช้ System.Threading.Tasks; ใช้ Microsoft.Data.SqlClient; ใช้ WpfApp1.Models; เนมสเปซ WpfApp1.Classes { คลาสสาธารณะ EmployeesOperations { สาธารณะ สตริงคงที่ ConnectionString = "แหล่งข้อมูล =.\\SQLEXPRESS; ฐานข้อมูล = ทรัพยากรมนุษย์; ความปลอดภัยแบบรวม = True"; รายการคงที่สาธารณะ <พนักงาน> รายการ () { รายการ var = รายการใหม่ <พนักงาน> () ; var selectStatement = @" เลือกรหัสพนักงาน, ชื่อแรก, ชื่อนามสกุล, อีเมล, หมายเลขโทรศัพท์, วันที่จ้าง, รหัสงาน, เงินเดือน, รหัสผู้จัดการ, รหัสแผนกจาก dbo.employees; "; ใช้ (var cn = new SqlConnection () { ConnectionString = ConnectionString }) { ใช้ (var cmd = new SqlCommand () { Connection = cn, CommandText = selectStatement}) { cn.Open (); โปรแกรมอ่าน var = cmd.ExecuteReader(); ในขณะที่ (reader.Read()) { พนักงาน var = พนักงานใหม่ () { EmployeeId = reader.GetInt32(0), FirstName = reader.GetString(1), LastName = reader.GetString(2), Email = reader.GetString( 3), PhoneNumber = reader.SafeGetString(4), HireDate = reader.GetDateTime(5), JobId = reader.GetInt32(6), เงินเดือน = reader.GetDecimal(7), ManagerId = reader["manager_id"].DbCast< int>(), DepartmentId = reader.GetInt32(9), Manager = พนักงานใหม่ (), InverseManager = new List
() }; รายการเพิ่ม (พนักงาน); } } } รายการส่งคืน; } } DbExtensions ระดับคงที่สาธารณะ { สาธารณะคงที่ T? DbCast (วัตถุนี้ dbValue) โดยที่ T : struct { สวิตช์ (dbValue) { กรณี null: กรณี DBNull _: ส่งคืน null; } ที? ค่า = dbValue เป็น T?; ถ้า (ค่า != null) { ส่งคืนค่า; } ถ้า (dbValue คือ IConvertible conv) { ค่า = (T)conv.ToType(typeof(T), CultureInfo.InvariantCulture); } ค่าส่งกลับ; } สตริงสาธารณะแบบคงที่ SafeGetString (เครื่องอ่าน SqlDataReader นี้, int colIndex) { ถ้า (!reader.IsDBNull(colIndex)) { กลับ reader.GetString(colIndex); } กลับ string.Empty; } } } 0 ความคิดเห็นไม่มีความคิดเห็น
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
ลงชื่อเข้าใช้เพื่อตอบ
กิจกรรม
ลงชื่อเข้าใช้เพื่อติดตามคำถามและผู้ใช้