C#WPF将数据网格列大小设置为自动而不知道列

时间:2014-12-01 21:01:14

标签: c# mysql wpf

我创建了一个从MySQL数据库填充数据表的函数,然后使用此函数设置DataGrid的源,它按预期工作。我的问题是这个特殊的表只有两个字段,因此留下了很多空间,我的研究表明我必须将单个列宽设置为“*”表示自动,但是因为数据网格只在编译时填充我不能访问这些列,还是我可以?

我很难找到编辑这些列的方法,因为它们在编译时才出现,例如我还想更改这些列的“标题”。

这是我的代码;

从查询中填写数据表的功能

    // 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");
    }

感谢。

4 个答案:

答案 0 :(得分:1)

" *"按比例划分空间

所以2列用" *"宽度将占用可用空间的相等份额。

如果1列有"*"而第二列"2*"则第1列将有1/3,第2列有2/3可用空间。

如果您希望列自动调整大小,请使用" auto"

您需要将列绑定到表列名称并设置标题。

<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>

答案 1 :(得分:1)

现在你要自动生成列,这样才能生效

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

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

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

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

答案 2 :(得分: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;

答案 3 :(得分: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);
}