Laden...
J
jbrown
myCSharp.de - Member
3
Themen
20
Beiträge
Letzte Aktivität
vor 5 Monaten
Dabei seit
25.08.2021
Erstellt vor 5 Monaten

Moin,

ich gehe üblicherweise den Weg, die Eingabe über einen zusätzlichen Dialog anzubieten. Möglicherweise ist das auch eine Alternative für dich.

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
            <TextBlock Style="{StaticResource FormTextBlockStyle}" Text="{Binding Note}" TextAlignment="Left" HorizontalAlignment="Left"/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <DockPanel LastChildFill="True">
            <Button Content="Bearbeiten" Margin="0,0,4,0" Command="{Binding EditNoteCommand}"/>
            <TextBlock HorizontalAlignment="Left" TextAlignment="Left" VerticalAlignment="Center" Style="{StaticResource FormTextBlockStyle}" Text="{Binding Note}" />
        </DockPanel>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

Solltest du bei deinem Vorhaben bleiben wollen, musst du dich ein wenig mit den DataGridCell - Events und dem Stichwort "Eingabefokus" beschäftigen.

<Popup
	IsOpen="{Binding IsSelected, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}}"
    Placement="MousePoint"
    StaysOpen="False">
    <TextBox
        Width="300"
        Height="200"
        AcceptsReturn="True"
        Text="{Binding Note}" />
Erstellt vor 6 Monaten

Das würde mich ebenfalls interessieren, passierte öfter in den letzten Wochen. Lösung bisher war das Löschen der [obj] und [bin] Ordner mit anschließender Projekt Neuerstellung.

Erstellt vor einem Jahr

Ich verstehe nicht ganz was du vorhast, aber vermutlich dies:


            string name = null;
            string pass =null;


            foreach (DataRow datarow in table.Rows)
            {
                name= datarow["Benutzername"].ToString();
                pass = datarow["Passwort"].ToString();
            
               if (name.Contains(Txt_Benutzername.Text) && pass.Contains(Txt_Passwort.Text))
               {
                   MessageBox.Show("Klappt");
               }
               else
               {
                   MessageBox.Show("Klappt nicht");
               }
            }

Erstellt vor 2 Jahren

Nicht einfach aufgeben 🙂

Die DataGrid Eigenschaft AutoGenerateColumns sollte das erste Problem lösen.


<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ProjektUmsatzTabelle}"/>

Diese kannst du natürlich auch so setzen:


Dtg_Umsatzvorschau.AutoGenerateColumns=false;
Dtg_Umsatzvorschau.ItemsSource = ProjektUmsatzTabelle;

Formatierung:
Standard numeric format strings

Wenn du das erledigt hast, ist dies eine Variante für das nächste Problem:


<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="FontWeight"  Value="Bold" />
        <Setter Property="HorizontalAlignment" Value="Center" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
    </Style>
</DataGrid.ColumnHeaderStyle>

Du solltest neben all dem aber versuchen zu verstehen, warum deine Bindung in XAML nicht klappt, die im Codebehind jedoch schon.

Erstellt vor 2 Jahren

<DataGrid ItemsSource="{Binding Path=TestViewModel.ProjektUmsatzTabelle}"/>

Du bindest damit bereits an die Auflistung deines Typs "Jahrestabelle".
Analog zu Th69´s Vorgehen sollte es dann so in etwa gehen:


...
Spalte = new DataGridTextColumn() { Header = "Kunde", Binding = new Binding("Kunde") };
Spalte = new DataGridTextColumn() { Header = "Projekt", Binding = new Binding("Projekt") };
...
for (int j = ProgStartJahr; j ≤ ProgEndJahr; j++)
    {
        Spalte = new DataGridTextColumn()
        {
            Header = j,
            Binding = new Binding(string.Format("[{0}].Volumen", j - ProgStartJahr))
        };
        Dgd_Umsatzvorschau.Columns.Add(Spalte);
    }

Erstellt vor 2 Jahren

Ich verstehe immer noch nicht ganz wie das aussehen soll, aber mein erster Gedanke ging in diese Richtung (vor meinem eigentlichen Job schnell getippt 🙂


public class JahresTabelle : ObservableCollection<VolumeDetail>
        {
            public JahresTabelle(string kunde, string projectName)
            {
                Kunde = kunde;
                ProjektName = projectName;
            }

            public string Kunde { get; set; }
            public string ProjektName { get; set; }
        }


public class VolumeDetail
        {
            public VolumeDetail(int jahr, double[] volumen)
            {
                Jahr = jahr;
                Volumen = volumen.ToList();

                Summe = Volumen == null ? 0 : Summe = Volumen.Sum();
            }

            public int Jahr
            { get; private set; }

            public List<double> Volumen
            { get; private set; }

            public double Summe
            { get; private set; }
        }


            Random random = new Random();

            var projektBezeichnungsTabelle = new List<JahresTabelle>();
            var progStartJahr = 2022;
            var progEndJahr = 2030;

            //erstellt 50 Kunden mit einem Projekt
            for (int tempID = 0; tempID < 50; tempID++)
            {
                var data = new JahresTabelle("Kunde" + tempID, "Projekt" + tempID);
                for (int jahr = progStartJahr; jahr < progEndJahr; jahr++)
                {
                    var volumesOfYear = new double[]
                    {
                        random.NextDouble(),
                        random.NextDouble(),
                        random.NextDouble(),
                    };                    
                    data.Add(new VolumeDetail(jahr, volumesOfYear));                
                }
                projektBezeichnungsTabelle.Add(data);
            }


            //create columns
            DataGridTextColumn column;

            var columnCollection = new List<DataGridTextColumn>();
            {
                //kunde
                column = new DataGridTextColumn()
                {
                    Header = "Kunde",
                    Binding = new Binding("Kunde")
                };
                columnCollection.Add(column);

                //projekt
                column = new DataGridTextColumn()
                {
                    Header = "ProjektName",
                    Binding = new Binding("ProjektName")
                };
                columnCollection.Add(column);

                //dynamic year columns               
                for (int j = progStartJahr; j < progEndJahr; j++)
                {
                    column = new DataGridTextColumn()
                    {
                        Header = "Vol. im Jahr " + j,
                        Binding = new Binding(string.Format("[{0}].Jahr.Summe", j - progStartJahr))
                    };
                    columnCollection.Add(column);
                }

Erstellt vor 2 Jahren

Mir ist nicht ganz klar, wie das Ergebnis aussehen soll oder darf:

Kunde 1 | Projekt 1 | [44,5] [2,3] [0,8]
Kunde 1 | Projekt 2 | [2,3] [4,5] [9,8] [3,3]
Kunde 2 | Projekt 1 | [9,8] [2,5]

oder eher so?

Kunde 1 | Projekt 1 | 44,5
Kunde 1 | Projekt 1 | 2,3
Kunde 1 | Projekt 1 | 0,8
Kunde 1 | Projekt 2 | 2,3
Kunde 2 | Projekt 2 | 4,5
Kunde 2 | Projekt 2 | 9,8
Kunde 2 | Projekt 2 | 3,3
usw...

Erstellt vor 2 Jahren

Guten Abend,

ich suche nach einem Lösungsansatz. Ich möchte eine Arbeitswoche über 7 Spalten darstellen, welche initial je 10 Zeilen für ein Employee - Drop bereitstellt (siehe Bild im Anhang). Aktuell habe ich mich hier für ein DataGrid als Basis entschieden und versuche dies entsprechend meiner Ideen zu modifizieren. Hierbei suche ich nach für mich attraktiven Varianten ein Modell zu entwickeln, welches "einfach" gebunden und via ViewModel modifiziert werden kann. Mein aktueller Ansatz sieht aktuell so aus, erscheint mir aber unnötig kompliziert. Habt ihr andere Ansätze?


public class MatrixSource : ObservableCollection<MatrixRow>
    {
        public MatrixSource(int year, int week, string workingArea, ShiftEnum shift, int initialRowCount = 10)
        {            
            WeekOfYear = year;
            Week = week;
            WorkingArea = workingArea;
            Shift = shift;
            DateRange = DateProvider.Get_WeekDateRangeOf(week, year);

            Build(DateRange, initialRowCount);
        }
        public List<MatrixColumn> ColumnInfoList
        { get; private set; }

        private void
            Build(CalendarDateRange dateRange, int initialRowCount)
        {
            #region create columninfos

            ColumnInfoList = new List<MatrixColumn>();
            
            var startDate = dateRange.Start.Date;

            while(startDate < dateRange.End.Date.AddDays(1))
            {
                var columnHeader = new ShiftHeaderData(new DateInfo(startDate), ShiftEnum.Unbekannt, string.Empty, string.Empty);
                var columnInfo 
                    = new MatrixColumn(this, ColumnInfoList.Count, columnHeader);

                ColumnInfoList.Add(columnInfo);

                startDate = startDate.AddDays(1);
            }

            #endregion

            #region create default rows

            for (int rowIndex = 0; rowIndex < 10; rowIndex++)
            {
                var row = new MatrixRow(this, rowIndex, ColumnInfoList.Count);
                row.OnRowDataChanged += Row_DataChanged;

                Add(row);
            }                

            #endregion
        }


public class MatrixColumn : BaseNotify
    {
        public MatrixColumn(MatrixSource parent, int displayIndex, ShiftHeaderData headerData)
        {
            ParentMatrix= parent;
            DisplayIndex = displayIndex;
            HeaderData = headerData;
        }

        #region properties

        public MatrixSource ParentMatrix
        { get; private set; }

        public ShiftColumn ParentColumn
        { get; set; }

        public int DisplayIndex 
        { get; private set; }

        public ShiftHeaderData HeaderData 
        { get; private set; }

        #endregion
    }


public class MatrixRow : ObservableCollection<EmployeeCellData> , INotifyPropertyChanged
    {
        public MatrixRow(MatrixSource parentMatrix, int displayIndex, int defaultCellCount = 7)
        {
            ParentMatrix = parentMatrix;
            DisplayIndex = displayIndex;

            for (int cellIndex = 0; cellIndex < defaultCellCount; cellIndex++)
            {
                var cell = new EmployeeCellData(parentMatrix, this);

                cell.OnDataChanged += Cell_OnDataChanged;

                Add(cell);
            }
        }
   }

In XAML binde ich so:


<local:ShiftDataGrid x:Name="DebugDG" Grid.Column="1" Grid.Row="1" MinRowHeight="30"                                 
                                 GenerateDefaultMatrixSource="True"
                                 MatrixSource="{Binding Path=MatrixSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

Damit mein DataGrid damit auch was anfangen kann:


public class ShiftDataGrid : DataGrid, INotifyPropertyChanged
    {
        public ShiftDataGrid()
        {
            InitMe();
        }

        #region events

        public event PropertyChangedEventHandler PropertyChanged = delegate { };

        #endregion

        #region properties
       
        public static readonly DependencyProperty MatrixSourceProperty = DependencyProperty.Register("MatrixSource", typeof(MatrixSource), typeof(ShiftDataGrid), new PropertyMetadata(OnMatrixSourceChanged));
        public MatrixSource MatrixSource
        {
            get { return (MatrixSource)GetValue(MatrixSourceProperty); }
            set
            {
                SetValue(MatrixSourceProperty, value);
            }
        }

        public static readonly DependencyProperty GenerateDefaultMatrixSourceProperty = DependencyProperty.Register("GenerateDefaultMatrixSource", typeof(bool), typeof(ShiftDataGrid), new PropertyMetadata(false));
        public bool GenerateDefaultMatrixSource
        {
            get { return (bool)GetValue(GenerateDefaultMatrixSourceProperty); }
            set
            {
                SetValue(GenerateDefaultMatrixSourceProperty, value);
            }
        }
        private void
            Build_Matrix(MatrixSource matrixData)
        {
            IsBusy = true;
            {
                SelectedCells?.Clear();
                SelectedLastEmployeeCell = null;
                Columns?.Clear();

                if (matrixData != null)
                {
                    foreach (var columnInfo in matrixData.ColumnInfoList)
                    {
                        columnInfo.ParentColumn 
                            = new ShiftColumn(columnInfo.HeaderData);

                        Columns.Add(columnInfo.ParentColumn);
                    }

                    ItemsSource = matrixData;
                }
            }
            IsBusy = false;
        }

        private static void
            OnMatrixSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            (sender as ShiftDataGrid).Build_Matrix(e.NewValue as MatrixSource);
        }


Und eine entsprechende DataGridColumn:


public class ShiftColumn : DataGridBoundColumn
    {
        public ShiftColumn(ShiftHeaderData headerData)
        {
            this.Header = headerData;
        }
       protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            EmployeeCellPresenter presenter = new EmployeeCellPresenter() //<----- UserControl als Drag&Drop target/sourc
            {                
                IsDragEnabled = true,
                IsDragIndicatorEnabled = true,
                IsDropEnabled = true,
                IsDropIndicatorEnabled = true
            };

            Binding binding;

            #region bind DataContext

            binding = new Binding();
            {
                binding.Source = cell;
                binding.Mode = BindingMode.TwoWay;
                binding.Path = new PropertyPath("DataContext");
            }
            BindingOperations.SetBinding(presenter, EmployeeCellPresenter.DataContextProperty, binding);

            #endregion

            #region bind cell data

            binding = new Binding();
            {
                binding.Source = cell;
                binding.Mode = BindingMode.TwoWay;
                binding.Path = new PropertyPath("DataContext.[" + cell.Column.DisplayIndex + "]");
            }
            BindingOperations.SetBinding(presenter, EmployeeCellPresenter.CellDataProperty, binding);

            #endregion            
            ...     


public class EmployeeCellData : BaseNotify
    {
        public EmployeeModel Data { get; set; }
        ...
    }

Erstellt vor 2 Jahren

Aus deinem switch (bool) solltest du ein if () else machen.
Und ich würde die View erst erzeugen und dann zuweisen:

@Abt

  1. Das hatte ich bereits als Verbesserung angenommen.

@Th69
2. Das wollte ich wissen und wirkt unter deinem Beispiel dann auch gut erklärt.


Aber irgendwie wußte ich wohl intuitiv, daß etwas an der View-Erzeugung nicht stimmt...

Darum hab ich mich an euch gewendet. Danke nochmal.