C# WPF Autocreate Label из базы данных
Я хочу автоматически создать ярлык из базы данных. Например У меня есть таблица [работники] со столбцами [идентификатор][имя][имя] и т. Д. Когда я создаю нового работника, я хочу, чтобы приложение создавало новый ярлык с его именем / именем и т. Д.
Я попытался связать ярлык вручную, но это не главное.
label1.Text = dt.Rows[0]["Worker_Name"].ToString()
Да, я знаю, что это не из WPF.
На последнем шаге я хочу перетащить приложение, где я буду перетаскивать работников (метки) в новые разделы, новых учащихся и т. Д., Но это будет в будущем:) (извините за мой английский)
1 ответ
РЕДАКТИРОВАТЬ
Решение WPF будет рассматриваться по-разному. Вот как я это сделал. ItemSrid ItemSrid будет привязан, а DataContext будет установлен в коде за ObservableCollection.
Поэтому, если вы хотите создать метки для всех записей в вашей сетке, вы должны выполнить итерацию по ObservableCollection, создать новую метку и установить свойства из данных в ObservableCollection. Если вы хотите создать метку, когда пользователь нажимает на запись в DataGrid, я бы сделал следующее (измененный из некоторого другого кода!).
XAML
<DataGridTextColumn Binding="{Binding BackR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="R" Width="40"/>
<DataGridTextColumn Binding="{Binding BackG, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="G" Width="40"/>
<DataGridTextColumn Binding="{Binding BackB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="B" Width="40"/>
<DataGridTextColumn Binding="{Binding Tags, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="Tags" Width="90"/>
</DataGrid.Columns>
</DataGrid>
В модели
private ObservableCollection<PaletteEntry> _paletteEntries = new ObservableCollection<PaletteEntry>();
public ObservableCollection<PaletteEntry> PaletteEntries
{
get { return _paletteEntries; }
set { _paletteEntries = value; OnPropertyChanged("PaletteEntries"); }
}
public class PaletteEntry : INotifyPropertyChanged
{
private string _count;
public string Count
{
get { return _count; }
set
{
_count = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Count"));
}
}
private string _readOnly;
public string ReadOnly
{
get { return _readOnly; }
set
{
_readOnly = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("ReadOnly"));
}
}
private string _displayPalletteType;
public string DisplayPalletteType
{
get { return _displayPalletteType; }
set
{
_displayPalletteType = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DisplayPalletteType"));
}
}
private string _title;
public string Title
{
get { return _title; }
set
{
_title = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Title"));
}
}
private SolidColorBrush _background;
public SolidColorBrush Background
{
get { return _background; }
set
{
_background = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Background"));
}
}
private string _backname;
public string BackName
{
get { return _backname; }
set
{
_backname = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackName"));
}
}
private string _backR;
public string BackR
{
get { return _backR; }
set
{
_backR = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackR"));
}
}
private string _backG;
public string BackG
{
get { return _backG; }
set
{
_backG = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackG"));
}
}
private string _backB;
public string BackB
{
get { return _backB; }
set
{
_backB = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BackB"));
}
}
private SolidColorBrush _foreground;
public SolidColorBrush Foreground
{
get { return _foreground; }
set
{
_foreground = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Foreground"));
}
}
private string _forename;
public string ForeName
{
get { return _forename; }
set
{
_forename = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("ForeName"));
}
}
private string _foreR;
public string ForeR
{
get { return _foreR; }
set
{
_foreR = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("ForeR"));
}
}
private string _foreG;
public string ForeG
{
get { return _foreG; }
set
{
_foreG = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("ForeG"));
}
}
private string _foreB;
public string ForeB
{
get { return _foreB; }
set
{
_foreB = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("ForeB"));
}
}
private string _tags;
public string Tags
{
get { return _tags; }
set
{
_tags = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Tags"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChange(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
};
В коде позади
WindowsColorPallete.DataContext = null;
WindowsColorPallete.DataContext = viewModel.PaletteEntries;
private void WindowsColorPallete_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (!WindowsColorPallete.IsReadOnly)
return;
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
return;
if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
DataGridRow row = dep as DataGridRow;
var ple = (ColorPickerViewModel.PaletteEntry)row.Item;
currentPaletteEntry = ple;
// HERE AS AN EXAMPLE IS WHERE I WOULD INSTANTIATE A NEW LABEL AND SET THE PROPERTIES
// FROM THE ObservableCollection
// EG
var l = new Label();
l.Content = ple.Title;
// ETC :)
if (ple.Title != "")
TitleValue.Text = ple.Title;
if (ple.Tags != "")
TagsValue.Text = ple.Tags;
}
}
Я думаю, я понимаю, чего вы хотите достичь. Это из какого-то старого кода C#, который я написал много лет назад. Я загрузил сетку данных с данными, а затем перебрал их, создавая при необходимости метки. Как вы можете видеть, он добавляет новые метки и новый RichTextBox в контейнер, панель и устанавливает данные свойств на основе информации в сетке данных. Он также управлял позиционированием.
Надеюсь, я понял, что вы хотели, и это помогает.
Джим
for (int i = 0; i < dgv_Fields.Rows.Count; i++)
{
// Add a key field column that has NOT been selected to a column
if (Convert.ToBoolean(dgv_Fields.Rows[i].Cells[0].Value) ||
(Convert.ToInt32(dgv_Fields.Rows[i].Cells["Key#"].Value) > 0 &&
!Convert.ToBoolean(dgv_Fields.Rows[i].Cells[0].Value)))
{
dgv_columns.ColumnCount = count + 1;
cName = FirstLetterToUpper(dgv_Fields.Rows[i].Cells[1].Value.ToString());
dgv_columns.Columns[count].Name = dgv_Fields.Rows[i].Cells[1].Value.ToString();
if (Convert.ToInt32(dgv_Fields.Rows[i].Cells["Key#"].Value) > 0)
dgv_columns.Columns[count].Tag = dgv_Fields.Rows[i].Cells["Key#"].Value;
else
dgv_columns.Columns[count].Tag = "";
if ((Convert.ToInt32(dgv_Fields.Rows[i].Cells["Key#"].Value) > 0 &&
!Convert.ToBoolean(dgv_Fields.Rows[i].Cells[0].Value)))
dgv_columns.Columns[count].Name = "*" + dgv_Fields.Rows[i].Cells[1].Value.ToString();
tbx = x + 160;
label = new Label();
label.Name = "l" + count.ToString();
label.Text = cName.PadRight(25);
if ((Convert.ToInt32(dgv_Fields.Rows[i].Cells["Key#"].Value) > 0 &&
!Convert.ToBoolean(dgv_Fields.Rows[i].Cells[0].Value)))
label.Text = "*" + cName.PadRight(25);
label.Location = new Point(x, y);
label.Font = new Font("Microsoft Sans Serif", 8, FontStyle.Bold);
label.AutoSize = true;
panel1.Controls.Add(label);
richtextbox = new RichTextBox();
richtextbox.Name = "rtb" + count.ToString();
richtextbox.Location = new Point(tbx + 10, y - 4);
richtextbox.Font = new Font("Microsoft Sans Serif", 8, FontStyle.Bold);
richtextbox.Size = new Size(100, 35);
richtextbox.Tag = count.ToString();
richtextbox.Click += new EventHandler(richtextbox_Click);
richtextbox.TextChanged += new EventHandler(richtextbox_TextChanged);
panel1.Controls.Add(richtextbox);
y += 40;
count++;
}
}