2014-12-01 28 views
2

我创建了一个函数来填充MySQL数据库中的数据表,然后使用此函数设置按预期工作的DataGrid的源。我的问题是这个特定的表只有两个字段,因此留下了很多空间,我的研究表明,我必须将各个列宽设置为“*”,意思是自动,但是因为数据网格只在编译时填充,所以我不能访问这些列,或者我可以吗?C#WPF在不知道列的情况下将数据网格列的大小设置为自动

我很努力地找到一种方法来编辑这些列,因为它们在编译时不存在,例如我也想更改这些列的“标题”。

这是我的代码,因为它代表;

函数从查询

// Function to load Query Data into a Data Table 
    public DataTable LoadIntoDataTable(string SQLQuery) 
    { 
     // Create a Data Table 
     DataTable dataTable = new DataTable(); 

     // Check Connection 
     if (this.OpenConnection() == true) 
     { 
      try 
      { 
       // Initialise my data adapter with a query 
       MySqlDataAdapter dataSource = new MySqlDataAdapter(SQLQuery, Connection); 

       // Fill the Data Table based on the query 
       dataSource.Fill(dataTable); 

       // Close Connection 
       this.CloseConnection(); 

       // Return Data 
       return dataTable; 
      } 
      catch (MySqlException ex) 
      { 
       switch (ex.Number) 
       { 
        default: 
         { 
          MessageBox.Show("Error: " + ex.Number, "Error"); 
          break; 
         } 
       } 
      } 
     } 

     return dataTable; 
    } 

功能填充数据表来填充数据网格与信息

public void FillDataGrid() 
    { 
     // Create a Data Table and fill it with Information from Title Table 
     DataTable MyData = myDatabase.LoadIntoDataTable("SELECT * FROM titles"); 

     // Assign Data Table to the Data Grids Source 
     dg_TitlesView.ItemsSource = MyData.DefaultView; 

     // Count Table Rows and Change Relevant Label to Reflect this number 
     lbl_TitleCount.Content = myDatabase.CountTableRecords("titles"); 
    } 

感谢。

回答

1

您需要挂钩的AutoGeneratedColumns事件,该事件一旦触发的所有汽车的生成的列已创建:

dgUsers.AutoGeneratedColumns += dgUsers_AutoGeneratedColumns; 

然后进行修改有:

void dgUsers_AutoGeneratedColumns(object sender, EventArgs e) 
    { 
     foreach (var oColumn in dgUsers.Columns) 
     { 
      // This is how to set the width to * 
      oColumn.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star); 

      // The header will contain the column name, so you can change it as needed 
      switch (oColumn.Header.ToString().ToLowerInvariant()) 
      { 
       case "id": 
        oColumn.Header = "Identifier"; 
        break; 

        // etc. 
      } 
     } 
    } 

更新

要设置单元格对齐方式,你需要在你的应用程序当中添加一个样式(即您的网格在托管窗口):

<Window.Resources> 
    <Style x:Key="CellRightAlign"> 
     <Setter Property="Control.HorizontalAlignment" 
     Value="Right" /> 
    </Style> 
</Window.Resources> 

,然后设置为使用此单元格样式:

  switch (oColumn.Header.ToString().ToLowerInvariant()) 
      { 
       case "id": 
        oColumn.CellStyle = (Style)Resources["CellRightAlign"]; 
        oColumn.Header = "Identifier"; 
        break; 
+0

谢谢,我真的希望这会工作,因为它看起来很理想,并避免XAML。我发现保持C#中的大部分工作增加了重用性。我试过你的代码 - 没有错误,但没有改变? – Torrm 2014-12-01 21:54:34

+0

@mbarrot:对不起,将错误的代码复制进去了。我编辑了答案并验证了它现在可以正常工作。 – 2014-12-01 22:02:56

+0

@Blam:我不认为这是一个好主意。如果您没有静态列名称,您将如何针对网格列单元格执行其他任务?例如,标题可以很容易地更新为区域或客户特定的术语。然后,更改数据表中列的名称将需要对列的动态引用(将ID映射到标题文本)通过代码的其余部分,这会使实现变得笨重和易碎。 – 2014-12-01 22:07:36

1

“*”成比例地将所述空间

这样2列有“*”为宽度将采取的可用空间的相等份额。

如果1列有"*"而第二个"2*"那么列1将有1/3和第2列2/3的可用空间。

,如果你想在列自动调整大小,然后使用“自动”

你需要的列绑定到表的列名,并设置标题。

<DataGrid Height="104" Width="264"> 
    <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Column1}" Header="Column1" Width="*" /> 
      <DataGridTextColumn Binding="{Binding Path=Column2}" Header="Column2" Width="*" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

我觉得在DataGridColumns明星和汽车是一样的。 – Bijan 2014-12-01 21:25:28

+0

Thankyou @antinutrino这个工程,但是我在这之后结束了四列? – Torrm 2014-12-01 21:51:04

+0

@mbarrot你需要设置AutoGenerateColumns =“False” – antinutrino 2014-12-01 21:57:10

1

现在你是自动生成的列所以这应该工作

foreach (DataGridColumn dgc in dg1.Columns) dgc.Width = double.NaN; 

但我认为这更像是汽车不是*

如果你知道你有两个那就不要自动生成并在XAML中设置,如mbarot答案中所示。但我认为这将更像汽车。

或者使用转换器并使用DataGrid的1/2宽度。我知道我在做ListView GridView。

0

DataGrid在更改源时自动增加其列宽的宽度。但它确实不会减少它们,因此您应该手动执行此操作。

为了实现这一点,你可以使用这个事件:

<DataGrid TargetUpdated="DataGrid_TargetUpdated"> 

而其事件处理程序:

private void DataGrid_TargetUpdated(object sender, DataTransferEventArgs e) 
{ 
    var dg = sender as DataGrid; 
    dg.Columns[x].Width = 0; 
    dg.UpdateLayout(); 
    dg.Columns[x].Width = new DataGridLength(1, DataGridLengthUnitType.Star); 
} 
相关问题