Тема проекта: У меня был проект adp VBA MS Access 2003, который подключался к базе данных SQL Server. Теперь я конвертирую этот проект в C# WPF и собираюсь сохранять данные непосредственно в базу данных SQL Server из DataGrid в C# WPF.
Деталь: У меня есть DataGrid, который ItemsSource связывает с «ObservableCollection» с именем: «INVO_DATA_RASID_KHARID», а также «DataGridComboBoxColumn» с именем: «ANBAR_COLUMN», «ItemSource» этого «DataGridComboBoxColumn» заполняется через SQL Server.
Я хочу, чтобы этот «DataGridComboBoxColumn» отображался со значением по умолчанию, чтобы пользователь знал, что нет необходимости выбирать его вручную из списка «DataGridComboBoxColumn».
Я установил это значение по умолчанию через статическую переменную в коде этого метода с именем: «FillALLComboboxes».
введите здесь описание изображения
Проблема: учитывая, что «DataGridComboBoxColumn» в DataGrid, «ANBAR_COL» «DataGridComboBoxColumn» имеет значение по умолчанию, пользователю не нужно выбирать этот элемент вручную из списка «DataGridComboBoxColumn», но до тех пор, пока они дважды щелкают по в ячейке со списком 'ANBAR_COL' появится значение по умолчанию! Дело в том, что значение по умолчанию, установленное для DataGridComboBoxColumn, не будет отображаться до тех пор, пока пользователь не войдет в ячейку! введите здесь описание изображения
XAML:
<DataGrid x:Name = "INVO_LST_RASID_SUB"
EnableColumnVirtualization = "True"
EnableRowVirtualization = "True"
VirtualizingPanel.IsVirtualizing = "True"
VirtualizingPanel.VirtualizationMode = "Recycling"
ScrollViewer.CanContentScroll = "False"
KeyboardNavigation.TabNavigation = "Contained"
ItemsSource = "{Binding INVO_DATA_RASID_KHARID}"
Grid.Row = "5"
Margin = "5,10"
AutoGenerateColumns = "False" FlowDirection = "RightToLeft" SelectionUnit = "FullRow" BorderThickness = "1" >
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name = "ANBAR_COLUMN" MinWidth = "80" Width = "auto" Header = " انبار "
SelectedValueBinding = "{Binding ANBAR,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath = "NAMES" SelectedValuePath = "CODE">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType = "{x:Type ComboBox}">
<Setter Property = "IsEditable" Value = "True"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
Код моего окна (С#):
//MainWindow:
public partial class HEAD_LST_RASID : Window
{
public ObservableCollection<INVO_LST_RASID_KHARID_CSHARP> INVO_DATA_RASID_KHARID { get; set; } = new ObservableCollection<INVO_LST_RASID_KHARID_CSHARP>();
public HEAD_LST_RASID()
{
InitializeComponent();
this.DataContext = this;
}
public void FillALLComboboxes()
{
string RowSource_ANBAR = "SELECT CODE, NAMES FROM dbo.TCOD_ANBAR";
//Search for the default value if it exists
var rst = dbms.Database.SqlQuery<int?>("SELECT ANBCO FROM dbo.OPANBACCESS WHERE (USERCO = " + Baseknow.USERCOD + " ) ORDER BY dbo.OPANBACCESS.RDF").ToList();
if (rst.Count > 0)
{
Baseknow.anbardef = (int)rst.FirstOrDefault();
}
var ARST = dbms.Database.SqlQuery<Custom_TCODANBAR>(RowSource_ANBAR).ToList();
ANBAR_COLUMN.ItemsSource = ARST;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
FillALLComboboxes();
var QRE_LST = dbms.Database.SqlQuery<INVO_LST_RASID_KHARID_CSHARP>($@"SELECT * FROM INVOICES").ToList();
INVO_DATA_RASID_KHARID?.Clear();
foreach (var item in QRE_LST)
INVO_DATA_RASID_KHARID.Add(item);
}
}
Класс модели:
//Model:
public class CTABLES
{
public class INVO_LST_RASID_KHARID_CSHARP : INotifyPropertyChanged, ICloneable
{
public object Clone()
{
return this.MemberwiseClone();
}
public INVO_LST_RASID_KHARID_CSHARP()
{
ANBAR = Baseknow.anbardef;
}
private int? _anbar;
public int? ANBAR
{
get
{
return _anbar;
}
set
{
if (_anbar == value)
return;
_anbar = value;
OnPropertyChanged("ANBAR");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Я хочу показать, что значение по умолчанию было выбрано для этого поля со списком внутри «DataGrid», когда данные «DataGrid» загружаются (без необходимости двойного щелчка и перехода в режим CellEditing).





Я обошел свою проблему, и это сработало! :
XAML:
<DataGridComboBoxColumn x:Name = "ANBAR_COLUMN"
DisplayMemberPath = "NAMES" SelectedValuePath = "CODE"
SelectedValueBinding = "{Binding ANBAR,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
MinWidth = "80" Width = "auto" Header = " انبار "
>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType = "{x:Type ComboBox}">
<Setter Property = "IsEditable" Value = "True"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType = "ComboBox">
<Setter Property = "SelectedIndex" Value = "{Binding DefaultValDisplay, Source = {StaticResource BoundyAnbar}}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
С#:
using System.ComponentModel;
namespace WpfApp5.Boundy
{
public class CL_Boundy : INotifyPropertyChanged
{
private int _myPropertyVariable = 0;
public int DefaultValDisplay
{
get { return _myPropertyVariable; }
set
{
_myPropertyVariable = value;
OnPropertyChanged(nameof(DefaultValDisplay));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Я хочу, чтобы значение по умолчанию для столбца поля со списком отображалось для новой строки без необходимости двойного щелчка по новой строке, я думаю, что пользователь покажет значение по умолчанию в новой строке, ничего не делая.