我正在使用Visual Studio 2012并制作了一个Windows窗体应用程序,其中一个窗体我使用的是datagridview,它显示了SQL数据库中表的信息。
我已经自动将表格加载信息从datagridview行直接导入到文本框中。
SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM Stock", con);
DataTable DATA = new DataTable();
SDA.Fill(DATA);
dataGridView1.DataSource = DATA
txtStock3.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
Descriptioncombo2.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
txtprice2.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
问题是我需要添加上一个按钮和下一个按钮,以便用户可以浏览datagridview行,并在datagridview行的每一列的文本框中查看信息。我已经查看了类似的问题并浏览了互联网以寻找解决我问题的方法,但我似乎无法找到适用于我的代码的方法。您还可以告诉我如何添加一行代码,告诉用户如果他们单击数据库的所有行,则不会再选择行。
答案 0 :(得分:4)
提供导航的一种方法是使用BindingNavigator,您可以在其中删除不必要的按钮,对于TextBox,您可以使用数据绑定。
负责加载数据的代码。根据需要更换catch中的console.writeline,例如:写入日志文件等。
public class DataOperations
{
public DataTable LoadCustomers()
{
DataTable dtCustomers = new DataTable();
using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
string commandText = @"SELECT [Identfier], [CompanyName],[ContactName],[ContactTitle] FROM [NORTHWND1.MDF].[dbo].[Customers]";
using (SqlCommand cmd = new SqlCommand(commandText, cn))
{
try
{
cn.Open();
dtCustomers.Load(cmd.ExecuteReader());
dtCustomers.Columns["Identfier"].ColumnMapping = MappingType.Hidden;
dtCustomers.Columns["ContactTitle"].ColumnMapping = MappingType.Hidden;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
return dtCustomers;
}
}
在表单上,一个BindingNavigator,一个dataGridView,一个TextBox
DataOperations dataOps = new DataOperations();
BindingSource bsCustomers = new BindingSource();
bsCustomers.DataSource = dataOps.LoadCustomers();
dataGridView1.DataSource = bsCustomers;
bindingNavigator1.BindingSource = bsCustomers;
txtContactTitle.DataBindings.Add("Text", bsCustomers, "ContactTitle");
BindingNavigator的替代方法是使BindingSource表单级私有变量。然后在按钮中调用BindingSource.Move方法,例如bsCustomers.MoveFirst()
。当然还有MoveNext,MoveLast和MovePrevious。
答案 1 :(得分:2)
//first
int i = 0;
this.dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[dataGridView1.CurrentCell.ColumnIndex];
//prev
int prev = dataGridView1.CurrentRow.Index - 1;
if (prev >= 0)
{
this.dataGridView1.CurrentCell = dataGridView1.Rows[prev].Cells[dataGridView1.CurrentCell.ColumnIndex];
//MessageBox.Show(dataGridView1[0, dataGridView1.CurrentRow.Index].Value.ToString());
}
//next
int next = dataGridView1.CurrentRow.Index + 1;
if (next < dataGridView1.Rows.Count)
{
this.dataGridView1.CurrentCell = dataGridView1.Rows[next].Cells[dataGridView1.CurrentCell.ColumnIndex];
//MessageBox.Show(dataGridView1[0, dataGridView1.CurrentRow.Index].Value.ToString());
}
//last
int i = dataGridView1.Rows.Count - 1;
if (i < dataGridView1.Rows.Count)
{
this.dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[dataGridView1.CurrentCell.ColumnIndex];
//MessageBox.Show(dataGridView1[0, dataGridView1.CurrentRow.Index].Value.ToString());
}
答案 2 :(得分:1)
您可以将网格中的comulmns配置为匹配类型。然后在查询之后将数据绑定到此gridView。你添加了两个按钮,其中&#34; next&#34;按钮将获取网格的当前选定行,并将其设置为所选择的跟随者。以前会做相反的事情。这是一个小屁股的痛苦。我讨厌WinForms中的网格。过去4年,因为我没有看到它们,是我生命中最幸福的岁月
答案 3 :(得分:1)
作为Karen解决方案的替代方案,如果您愿意/必须使用按钮进行导航,那么您将要处理CurrentCellChanged
事件以及以下按钮{{1} } events:
Click
private void DataGridView1_CurrentCellChanged(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentRow != null)
{
txtStock3.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
Descriptioncombo2.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
txtprice2.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
this.prevButton.Enabled = this.dataGridView1.CurrentRow.Index > 0;
this.nextButton.Enabled = this.dataGridView1.CurrentRow.Index < this.dataGridView1.Rows.Count - 1;
}
}
private void PrevButton_Click(object sender, EventArgs e)
{
int prev = this.dataGridView1.CurrentRow.Index - 1;
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[prev].Cells[this.dataGridView1.CurrentCell.ColumnIndex];
}
private void NextButton_Click(object sender, EventArgs e)
{
int next = this.dataGridView1.CurrentRow.Index + 1;
this.dataGridView1.CurrentCell = this.dataGridView1.Rows[next].Cells[this.dataGridView1.CurrentCell.ColumnIndex];
}
事件将处理逻辑,如果您可以单击上一页或下一页。它们各自的点击事件只是将当前单元格向后或向前移动一行。