我有一个程序从MySQL数据库获取数据并将其显示到DataGridView。因为每行都是可以下载的应用程序,所以我希望每行都显示在它自己的小块中。这里有一个我想要的草图:
显示的每个框都是一行。每个部分(图标,应用程序名称,描述,downloadbtn)都是一列。 有谁知道怎么做?
答案 0 :(得分:2)
ListViews
不支持DataBinding
而DataGridviews
只支持显示行和列矩阵,因此它们无法并排显示行数据。
我建议您取消DataGridview
。
而是将数据绑定到合适的其他容器,并使用显示数据的UserControl
填充该容器。 AutoScrolling
FlowLayoutPanel
可能是最佳选择。
所以你创建了一个名为UserControl
的{{1}},添加了一些DataBox
和Labels
以及一个可以从{{{{}}加载数据的额外构造函数1}}。
然后编写一个加载函数,为表格中的每一行创建一个新的Button
,并将其字段加载到标签中。
然后,您可以从数据发生变化的所有位置调用该函数,例如DataTable.DataRow
的{{1}}事件。
这是一个最小的示例类:
DataBox
当数据更改时,显示屏将刷新:
RowChanged
这是一个加载函数,它加载表中的所有行:
DataTable
public delegate void ButtonClick(object sender, EventArgs e);
public partial class DataBox : UserControl
{
public DataRow row { get; set; }
public ButtonClick ButtonClick { private get; set; }
public DataBox()
{
InitializeComponent();
}
public DataBox(DataRow row)
{
InitializeComponent();
loadRow(row);
button1.GotFocus += (s, e) => { BackColor = Color.SkyBlue; };
button1.LostFocus += (s, e) => { BackColor = Color.Azure; };
}
public void loadRow(DataRow row_)
{
if (row_ == null || row_.ItemArray.Length < 3) return;
row = row_;
label1.Text = row.ItemArray[0].ToString();
label2.Text = row.ItemArray[1].ToString();
label3.Text = row.ItemArray[2].ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if (ButtonClick != null) ButtonClick(sender, e);
}
}
正在以您的形式调用中央点击处理功能:
private void DT_RowChanged(object sender, DataRowChangeEventArgs e)
{
loadBoxes();
}
但当然,您可以改为在void loadBoxes()
{
List<DataBox> boxes = new List<DataBox>();
foreach (DataRow row in DT.Rows)
boxes.Add(new DataBox(row) { ButtonClick = boxButton_Click } );
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.AddRange(boxes.ToArray());
boxes.Clear();
}
课程中对其点击进行编码..
您可能希望改进其他几点,例如更新单行或将Buttons
发送焦点转移到private void boxButton_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
DataBox box = btn.Parent as DataBox;
if (box != null)
Console.WriteLine(box.rowID + " clicked");
}
,从而导致DataBox
显示“选择” ..