اساتید عزیز امیدوارم بتونم مشکلم رو خوب توضیح بدم که مزاحم وقت شما نباشم.
این یک فرم wpf هست که غیر از دکمه اوکی و کنسل سه باتن (...) داره مربوط به اسم، شهر و مدرسه (فرم اولیه)
هر کدوم از این دکمه ها یک پنجره جدید رو باز می کنند که داری یک دیتاگرید هست و کاربر میتونه یکی از ردیف ها رو انتخاب کنه مثلا دکمه شهر city وقتی باز میشه از بین شهر ها می شه یک ردیف رو انتخاب کرد و مثلا با رویداد دابل کلیک اون شهر انتخاب شده به تکست باکس مربوطه منتقل میشه
نمونه فرم دیتاگرید مربوط به هر تکست باکس(فرم دوم)
در نهایت وقتی این سه تا تکست باکس در فرم wpf اول پر شدند کار با این قسمت تموم میشه.
یک چیزی شبیه این
مشکل من اینجاست که در رویداد دابل کلیک مربوطه چه چیزی باید بنویسم که فرم دیتا گرید بسته بشه و ردیف انتخاب شده به تکست باکس فرم اول منتقل بشه.
این توضیح رو هم بدم که دیتابیسم اس کیو ال هست و با استفاده از EntityFrameWork اتصال دیتاگرید ویو رو به جدول اس کیو ال برقرار شده
با سلام کد انتقال عبارت از گرید به تکس باکس رو بگذارید ما هم استفاده کنیم.
<DataGrid x:Name="UserGrid" ItemsSource="{Binding Users}"> ... </DataGrid> <TextBox Text="{Binding ElementName=UserGrid, Path=SelectedItem.Name}"/> ...More of the same...
از این پاسخ ها در Stack OverFlow پیدا میشه ولی مشکل من اینه که در این پاسخ هردوی تکست باکس ها و دیتا گرید در یک فرم هستند ولی در سوال بنده تکست باکس ها در فرم اول هستند و دیتاگرید ها در فرم دیگری که با کلیک روی باتن مربوطه باز میشن
با سلام
دوست من چیزی که به ذهن من میرسه واسه اینکار اینه که اطلاعات datagrid یا textbox ها رو درون یه لیست یا یه سری فیلد استاتیک از یه کلاس public بریزی و تو فرم دیگه هم اون فیلد ها رو داشته باشی و حالا یا binding انجام بدی یا نظیر به نظیر datagrid یا textbox ها رو پر کنی
باسلام
در این مثال با استفاده از EventHandler زیر مقادیر را از صفحه دوم به صفحه اول باز می گردانیم :
public event EventHandler PersonSelected;
کد XAML صفحه :
<Grid> <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="90"/> <ColumnDefinition Width="80*"/> <ColumnDefinition Width="350"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Margin="10">Name :</TextBlock> <Button Name="btnName" Grid.Column="1" Grid.Row="0" Margin="10" Click="btnName_Click">...</Button> <TextBox Name="txtName" Grid.Column="2" Grid.Row="0" Margin="10" IsReadOnly="True"></TextBox> <TextBlock Name="lblMessage" Grid.Column="2" Grid.Row="1" TextAlignment="Center" VerticalAlignment="Center" Background="Bisque" Padding="10" Margin="10">Sajad Bagherzadeh</TextBlock> </Grid>
کد cs صفحه اصلی :
public event EventHandler PersonSelected; protected virtual void OnPersonSelected() { EventHandler handler = PersonSelected; if (handler != null) handler(this, EventArgs.Empty); } public MainWindow() { InitializeComponent(); } private void btnName_Click(object sender, RoutedEventArgs e) { winNames win = new winNames(this); win.Owner = this; OnPersonSelected(); win.ShowDialog(); }
کد XAML صفحه دوم :
<StackPanel> <DataGrid Name="grdNameList" AutoGenerateColumns="False" IsReadOnly="True" MouseDoubleClick="GrdNameList_OnMouseDoubleClick"> <DataGrid.Columns> <DataGridTextColumn Header="نام ونام خانوادگی" Width="*" Binding="{Binding FullName}"></DataGridTextColumn> <DataGridTextColumn Header="سن" Width=".35*" Binding="{Binding Age}"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> </StackPanel>
کد cs صفحه دوم :
private MainWindow _mainWindow = new MainWindow(); public winNames() { InitializeComponent(); BindGridList(); } public winNames(MainWindow window) { InitializeComponent(); BindGridList(); window.PersonSelected += window_PersonSelected; } void window_PersonSelected(object sender, System.EventArgs e) { var mainWindow = sender as MainWindow; if (mainWindow != null) _mainWindow = mainWindow; } private void GrdNameList_OnMouseDoubleClick(object sender, MouseButtonEventArgs e) { if (_mainWindow != null) { var p = grdNameList.SelectedValue as Person; var message = "نام : " + p.FullName + " , سن : " + p.Age; _mainWindow.txtName.Text = message; _mainWindow.lblMessage.Text = message; this.Close(); } }
تشکر می کنم از توجه اساتید گرامی. البته من یک کار دیگه کردم نمیدونم چقدر مرسوم باشه یا پذیرفتنی. اون هم اینکه دیتا گرید صفحه دوم رو به صفحه اول منتقل کردم. البته بصورت پنهان. درنتیجه هروقت دکمه مربوطه صفحه اول رو اجرا می کنم دیتا گرید بصورت آشکار در میاد و پس از دابل کلیک کردن مقدارش خونده میشه و در تکست باکس ریخته میشه. و دوباره پنهان میشه. بنظرم خیلی راحت در اومد. البته چون لیست گریدها کم بود شاید مناسب باشه ولی نمیدونم توی دیتا حجم بالا هم مناسب باشه یا نه
سلام و خسته نباشید خدمت اساتید و دوستان عزیز.استاد باقرزاده امکانش هست که همین مطلب رو برای زبان C# هم قرار بدین ؟
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)