C# wpf как сделать автозаполнение поля с возможностью редактирования
Есть база данных с двумя таблицами. Мой вопрос затронет только вторую таблицу. И так в этой таблице 5 столбцов, см. картинку
В DataGrid UserContol'a отображаются только строки сплошной линией. Поле Number должно заполняться автоматически начиная с 001, но если щёлкнуть по полю , номер должен стереться и можно будет указать свой номер. При чем после отправки номер должен увеличиваться от последнего на один. Пример: 001, 002, 003, 009 следующий 010. А если удалим строку , то номер также от последнего. Пример удалили строку с номером 010 ( в поле 010) , далее удаляем строчку 009 (в поле 004).
Пока мне удалось реализоваться автозаполнение и прибавление.
Вот код (string на int я потом поправлю мне бы понять как сделать).
ViewModel (UserControl2VM)
private ObservableCollection<DataModel> сollection;
public ObservableCollection<DataModel> MyСollection
{
get { return сollection; }
set { Set(ref сollection, value); }
}
private string number1;
public string Number1
{
get {
using (CotextModel db = new ContextModel())
{
string numDb = (from value in db.dbTable where value.idKey2 == idReport orderby value.number descending select value.number).FirstOrDefault();
if (numDb == null) return number1 = "001";
int number1 = int.Parse(numDb) + 1;
return number1 = Convert.ToString(number1).PadLeft(3, '0');
}
}
set
{
if (!string.Equals(number1, value))
{
number1 = value;
OnPropertyChanged("Number1");
}
}
}
Тут я получаю Number1 и вывожу его во View
<TextBox Text="{Binding Number1, UpdateSourceTrigger=PropertyChanged}"/>
И команда для отправки в БД
//Команда добавления данных в таблицу dbTable и в коллекцию
public ICommand SaveDataCommand { get; set; }
private bool CanSaveDataExecute(object commandParameter) => true;
private void OnSaveDataExecuted(object commandParameter)
{
//indexIdReport = Convert.ToInt32(commandParameter);
MyDataModel myDataModel = new MyDataModel
{
idkey2 = IdReport,
number1 = Number1,
name = Name,
data = MyNewData,
};
//добавляем данные в БД
ContextData.AddToDb(myDataModel);
//добавляем данные в коллекцию
сollection.Add(myDataModel);
number1= (int.Parse(number1) + 1).ToString().PadLeft(3, '0');
name = string.Empty;
mydata = string.Empty;
}
...
...
public UserControl2VM()
{
//Команда удаления строки
DeleteCommand = new LambdaCommand(OnDeleteExecuted, CanDeleteExecute);
//Команда добавления
SaveDataCommand = new LambdaCommand(OnDataQsoExecuted, CanDataQsoExecute);
//Rоллекцию
MyСollection = new ObservableCollection<DataModel>(MyData.GetAllData().Where(p => p.idRkey2 == idReport));
}
У меня получается заполнять поле, при нажатии на кнопку Отправить, данные заносятся в БД, появляется в DataGrid, все заполненные ранее в полях TextBox стираются, а в TextBox Number1 появляется число большее от предыдущего на 1.
Но дальше ничего не получается, если удалю одну строку в DataGrid (в коллекции и в БД удаляется), а номер остается тот же который и был до удаления строки.
Также не получается изменить Number1 при клике по полю, не знаю как применить UpdateSourceTrigger=Explicit
Пока тут писал вопрос, понял почему при удалении не изменялся номер, надо было к команде удаления добавить тот же код, который при добавлении использовался number1 = (int.Parse(namber1) + 1).ToString().PadLeft(3, '0');
Теперь при удалении меняется номер на следующий.
Остается только вопрос как изменить значение поля при клике по полю. Я пробовал Mode=OneWay с ним можно менять поле, но запишется то значение, которое там было до изменения. По-моему тут как-то элементарно все делается, но я пока не вижу решения. Пока все мои познания с# на уровне "Зашел с улицы посмотреть, что тут делают" :) .
Ответы (1 шт):
В комментариях подсказали ответ.
Строка бендинга теперь такая.
<TextBox Text="{Binding Number1, Mode=TwoWay}"/>
ViewModel в get к Number1 добавил проверку:
public string Number1
{
get {
if (number1 != null) return number1; // Добавил
using (CotextModel db = new ContextModel())
{
string numDb = (from value in db.dbTable where value.idKey2 == idReport orderby value.number descending select value.number).FirstOrDefault();
if (numDb == null) return number1 = "001";
int number1 = int.Parse(numDb) + 1;
return number1 = Convert.ToString(number1).PadLeft(3, '0');
}
}
set
{
if (!string.Equals(number1, value))
{
number1 = value;
OnPropertyChanged("Number1");
}
}
}
Теперь все работает. Всем спасибо.