Как связать WPF DataGrid с переменным числом столбцов?

попробуйте это: -

HTML: -

<div class="row">
        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
            <div class=" bg-warning col-lg-12 col-md-12 col-sm-12 col-xs-2" style="border:solid black;">
                <div class="form-group" style="display: block;">
                    <label class="control-label col-lg-2 col-md-2 col-sm-2 col-xs-2" for="attendance" style="line-height:50px">Attendance:<span class="req"> *</span></label>
                </div>
                <div class="controls col-lg-1 col-md-1 col-sm-1 col-xs-1">
                    <label class="checkbox-inline" for="attendanceAllCBs"><input type="checkbox" class="attendanceAll" value="All" id="attendanceAllCBs" name="attendanceAllCBs[]">All</label>
                </div>

                <div class=" col-lg-9 col-xs-9 col-sm-9">
                    <div id="top">
                       <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="Friday" id="attendanceFriday" name="attendanceOtherCBs[]">Friday</label>
                        <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="Saturday" id="attendanceSaturday" name="attendanceOtherCBs[]">Saturday</label>
                        <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="Sunday" id="attendanceSunday" name="attendanceOtherCBs[]">Sunday</label>
                        <label class="checkbox-inline" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="DaysOnly" id="attendanceDaysOnly" name="attendanceOtherCBs[]">Days Only</label>
                    </div>
                    <div id="bottom">
                        <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="FridayNight" id="FridayNight" name="attendanceOtherCBs[]">Friday Night</label>
                        <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="SaturdayNight" id="SaturdayNight" name="attendanceOtherCBs[]">Saturday Night</label>
                        <label class="checkbox-inline col-lg-2" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="SundaydayNight" id="SundaydayNight" name="attendanceOtherCBs[]">Sundayday Night</label>
                        <label class="checkbox-inline" for="attendanceOtherCBs"><input type="checkbox" class="attendance2" value="Other" id="Other" name="attendanceOtherCBs[]">Other</label>
                    </div>
                </div>
            </div>
        </div>
    </div>




    jQuery:

             alert(4);
             var gender = '';

             alert(5);
             var attendanceAllvar = '';
             if ($('#attendanceAllCBs').prop('checked') === true){
                 alert("5a");
                 attendanceAllvar = "Y";
             }else{
                 alert("5b");
                 attendanceAllvar = "N";
             }
             alert(6);
             var attendanceFriday = '';
             if($('#attendanceFriday').prop('checked') === true){
                 attendanceFriday = "Y";
             }else{
                 attendanceFriday = "N";
             }
121
задан fedab 1 October 2014 в 15:04
поделиться

3 ответа

Я продолжил свое исследование и не нашел разумного способа сделать это. Свойство Columns на DataGrid не что-то, против чего я могу связать, на самом деле это только для чтения.

Bryan предположил, что что-то могло бы быть сделано с AutoGenerateColumns, таким образом, я взглянул. Это использует простое отражение .NET для рассмотрения свойств объектов в ItemsSource и генерирует столбец для каждого. Возможно, я мог генерировать тип на лету со свойством для каждого столбца, но это получает путь от дорожки.

Так как эта проблема так легко решена в коде, который я продолжу работать с простым дополнительным методом, который я называю каждый раз, когда контекст данных обновляется с новыми столбцами:

public static void GenerateColumns(this DataGrid dataGrid, IEnumerable<ColumnSchema> columns)
{
    dataGrid.Columns.Clear();

    int index = 0;
    foreach (var column in columns)
    {
        dataGrid.Columns.Add(new DataGridTextColumn
        {
            Header = column.Name,
            Binding = new Binding(string.Format("[{0}]", index++))
        });
    }
}

// E.g. myGrid.GenerateColumns(schema);
18
ответ дан 24 November 2019 в 01:33
поделиться

Вы смогли делать это с AutoGenerateColumns и DataTemplate. Я не положителен, если бы это работало бы без большой работы, необходимо было бы играть вокруг с ним. Честно, если бы у Вас уже есть рабочее решение, я просто еще не внес бы изменение, если нет большая причина. Управление DataGrid становится очень хорошим, но все еще требуется некоторую работу (и я имею большое в запасе обучение сделать) смочь сделать динамические задачи как это легко.

1
ответ дан 24 November 2019 в 01:33
поделиться

Вы можете создать пользовательский элемент управления с определением сетки и определить «дочерние» элементы управления с различными определениями столбцов в xaml. Родителю требуется свойство зависимости для столбцов и метод загрузки столбцов:

Родитель:


public ObservableCollection<DataGridColumn> gridColumns
{
  get
  {
    return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty);
  }
  set
  {
    SetValue(ColumnsProperty, value);
  }
}
public static readonly DependencyProperty ColumnsProperty =
  DependencyProperty.Register("gridColumns",
  typeof(ObservableCollection<DataGridColumn>),
  typeof(parentControl),
  new PropertyMetadata(new ObservableCollection<DataGridColumn>()));

public void LoadGrid()
{
  if (gridColumns.Count > 0)
    myGrid.Columns.Clear();

  foreach (DataGridColumn c in gridColumns)
  {
    myGrid.Columns.Add(c);
  }
}

Дочерний Xaml:


<local:parentControl x:Name="deGrid">           
  <local:parentControl.gridColumns>
    <toolkit:DataGridTextColumn Width="Auto" Header="1" Binding="{Binding Path=.}" />
    <toolkit:DataGridTextColumn Width="Auto" Header="2" Binding="{Binding Path=.}" />
  </local:parentControl.gridColumns>  
</local:parentControl>

И, наконец, сложная часть - найти, где вызвать LoadGrid.
Я борюсь с этим, но кое-что заработало, вызвав после InitalizeComponent в моем конструкторе окна (childGrid - x: name в window.xaml):

childGrid.deGrid.LoadGrid();

Соответствующая запись в блоге

2
ответ дан 24 November 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: