伙计们,我正在尝试通过C#Windows Forms应用程序中的bindingnavigator在我的datagridview中实现分页。

我只是将datagridview和bindingnavigator从工具栏拖动到窗体中。使用数据集,Datagridview被数据绑定(bind)到SQL Server中的数据库表。我在gridview中添加了3个额外的按钮,这些按钮将执行某些功能。

现在,我以前从未使用过bindingnavigator,因此我只是从其属性中选择了datagridview1的bindingsource作为bindingnavigator的数据源。

这是我的表单在运行时的外观:

当前,datagridview1显示我表中的所有记录(截至目前为31),并且绑定(bind)导航器的next按钮仅将我带到下一条记录(例如,从TicketID = 1到TicketID = 2)。

现在,我想做的是:

1.)Datagridview每页仅应显示10(或50)条记录,并且应使用bindingnavigator控件在页面之间进行切换,以使UI保持响应状态,并变得“内存效率更高”,因为最终我的数据库将具有成千上万条记录。

2.)BindingNavigator的控件应出现在表单的中心,而不是在左侧/右侧。我无法将其设置为以属性为中心。

我表格后面的代码:

       using System;
       using System.Collections.Generic;
       using System.ComponentModel;
       using System.Data;
       using System.Drawing;
       using System.Linq;
       using System.Text;
       using System.Threading.Tasks;
       using System.Windows.Forms;

       namespace WindowsFormsApplication2
       {
           public partial class Form9 : Form
           {
               public Form9()
    {
        InitializeComponent();
    }

    private void Form9_Load(object sender, EventArgs e)
    {
        this.CenterToScreen();
        try
        {
            this.tblTicketDetailTableAdapter.Fill(this.sTDataSet4.tblTicketDetail);
        }
        catch
        {
            MessageBox.Show("Error : Cannot establish a valid connection to database.", "SQL SERVER ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == dataGridView1.Columns["Detail"].Index)
        {
            //some code
        }
        else if (e.ColumnIndex == dataGridView1.Columns["Close"].Index)
        {
            //some code
        }
        else if (e.ColumnIndex == dataGridView1.Columns["ViewDetail"].Index)
        {
            //some code
        }
    }

}

现在我该怎么做才能使bindingnavigator用作分页控件?

最佳答案

一种方法是将父表分解为DataTables列表(或我的首选项BindingList<DataTable>),然后在导航器控件的位置更改上分配网格的DataSource:

BindingSource bs = new BindingSource();
BindingList<DataTable> tables = new BindingList<DataTable>();

protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);

  int counter = 0;
  DataTable dt = null;
  foreach (DataRow dr in tblTicketDetail.Rows) {
    if (counter == 0) {
      dt = tblTicketDetail.Clone();
      tables.Add(dt);
    }
    dt.Rows.Add(dr.ItemArray);
    ++counter;
    if (counter > 9) {
      counter = 0;
    }
  }
  bindingNavigator1.BindingSource = bs;
  bs.DataSource = tables;
  bs.PositionChanged += bs_PositionChanged;
  bs_PositionChanged(bs, EventArgs.Empty);
}

void bs_PositionChanged(object sender, EventArgs e) {
  dataGridView1.DataSource = tables[bs.Position];
}

只要将BindingNavigator控件居中,只需将Dock样式设置为None,然后将控件手动置于中心即可。设置好后,将“ anchor 定”设置为“无”,并且在调整容器大小时,工具栏应在中间“ float ”。

关于c# - 使用BindingNavigator与DataGridView进行分页功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21900763/

10-13 06:45