我创建了一个从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");
}
感谢。
答案 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);
}