我正在開發一個winforms應用程序。我有兩個datagrid視圖從兩個不同的綁定資源(控制)填充。我正在使用這些來實現主細節方法。我的問題是,當使用綁定源填充第一個datagridview時,我無法選擇它的第一行,因爲綁定源中的第一個元素是默認選擇的,無法選擇。任何人都可以爲我提供解決方案C#綁定源控件
C#綁定源控件
回答
正如你所說,第一行是默認選中的。因此,在將DataSource填充到第一個GridView後,可以基於第一個條目設置第二個GridView。稍後,您會檢查selectionChanged事件以基於第一個GridView的selectedRow填充第二個GridView。
代碼可能看起來像。像這樣:
private void PopulateDataSource()
{
dataGridView1.DataSource = myBindingSource;
DataRowView selectedRow;
if (dataGridView1.SelectedRows.Count > 0)
selectedRow = dataGridView1.SelectedRows[0] as DataRowView;
if (selectedRow != null)
dataGridView2.DataSource = myBindingSource2; //Set the BindingSource based on selectedRow in first Grid
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
DataRowView selectedRow;
if (dataGridView1.SelectedRows.Count > 0)
selectedRow = dataGridView1.SelectedRows[0] as DataRowView;
if (selectedRow != null)
dataGridView2.DataSource = myBindingSource2; //Set the BindingSource based on selectedRow in first Grid
}
如果這不起作用,讓我知道,但應該做的工作。
UDPATE
下面是一個使用事件和BindingSource的方法類似的例子:
private void Initialize()
{
RegisterBindingSourceEvents();
dataGridView1.DataSource = bindingSource1;
dataGridView2.DataSource = bindingSource2;
bindingSource1.DataSource = myDataSource;
}
private void RegisterBindingSourceEvents()
{
bindingSource1.DataSourceChanged += BindingSource1_DataSourceChanged;
bindingSource1.CurrentChanged += BindingSource1_CurrentChanged;
}
private void BindingSource1_CurrentChanged(object sender, EventArgs e)
{
DataRowView row = bindingSource1.Current as DataRowView;
if (row != null)
bindingSource2.DataSource = myDataSource2BasedOnRow;
}
private void BindingSource1_DataSourceChanged(object sender, EventArgs e)
{
DataRowView row = bindingSource1.Current as DataRowView;
if (row != null)
bindingSource2.DataSource = myDataSource2BasedOnRow;
}
而且你也許可以使用:
bindingSource.MoveNext();
bindingSource.MoveFirst();
爲了模擬重點Seconde系列排並直接排在第一排。有點醜,但我猜想這會觸發current_changed(未經測試)。更好地使用第一種方法
UDPATE-2
我很遺憾地告訴你,這是不可能在一個美麗的方式。問題是,如果您的DataSource包含項目,那麼您的bindingList的Current屬性總是被設置。所以如果用戶選擇與bindingSource相同的行當前屬性包含你的事件不會被調用。我找到了一個適用於我的例子的解決方案。你需要一個gridEvent,也許必須做一些改進,但這個想法應該能夠完成這項工作。對不起,但沒有gridEvent我不能解決這個問題:
請注意,iam使用列表作爲我的測試用例的數據源。你有DataTable,並且必須強制轉換爲DataRowView而不是Dummy。
private bool _automatedRowChange;
private void Initialize()
{
List<Dummy> dummies = new List<Dummy> { new Dummy { Id = 1, Text = "Test1" }, new Dummy { Id = 2, Text = "Test2" } };
bindingSource1.DataSource = dummies;
dataGridView1.DataSource = bindingSource1;
//So the first row isn't focused but the bindingSource Current Property still holds the first entry
//That's why it won't fire currentChange even if you click the first row. Just looks better for the user i guess
dataGridView1.ClearSelection();
bindingSource1.CurrentChanged += BindingSource1_CurrentChanged;
dataGridView1.CellClick += DataGridView1_CellClick;
}
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
var clickedRow = dataGridView1.Rows[e.RowIndex].DataBoundItem as Dummy;
var currentRow = bindingSource1.Current as Dummy;
if (clickedRow != null &&
currentRow != null &&
clickedRow.Equals(currentRow))
{
_automatedRowChange = true;
bindingSource1.MoveNext();
_automatedRowChange = false; //MovePrevious is based on the click and should load the dataSource2
bindingSource1.MovePrevious();
}
}
private void BindingSource1_CurrentChanged(object sender, EventArgs e)
{
if (!_automatedRowChange) //Check if you jump to next item automatically so you don't load dataSource2 in this case
{
//Set the second DataSource based on selectedRow
}
}
非常感謝。但是我的問題有點不同。我早些時候嘗試過上述解決方案,但沒有奏效。問題(在我的上下文中)是綁定源,如果我檢查dataGridView1.SelectedRows.Count它顯示0.這是因爲當我們使用綁定源綁定datagridview時,綁定源中的第一個元素是當前項(in綁定源)。所以加載第一個數據gridview後,我不能通過選擇第一個項目來調用綁定源的current_changed事件處理程序。在這種形式下,我想利用綁定源事件。 –
@VipinJacob我更新了我的答案,以實現使用bindingSource事件和方法的行爲。 – Sebi
它的工作原理,但我不想加載第二個datagridveiw最初。我只想加載第一個datagridview,然後用戶必須決定在第一個datagridveiw上進行選擇。根據該選擇,需要加載第二個datagridview。我想要使用綁定源事件。 –
- 1. 綁定源控件
- 2. 綁定控件
- 3. 濾波在C#綁定源
- 4. 將C#對象綁定到ListView /控件
- 5. C#Winforms將DataTable綁定到ReportrViewer控件
- 6. 綁定不同的控件c#
- 7. 微軟圖表控件 - Xml綁定? C#
- 8. 如何綁定object -c控件?
- 9. 將ListBox內部的控件綁定到ListBox源以外的源
- 10. WinForms - 在運行時更改控件的綁定源/數據源?
- 11. Silverlight控件綁定
- 12. 數據綁定 - 數據綁定控件
- 13. 綁定自定義控件
- 14. 綁定資源數據到自定義winjs控件
- 15. WPF綁定的綁定源
- 16. WPF:兩個控件綁定到一個源,如何過濾綁定?
- 17. 將WPF控件綁定到多個源(不是傳統的多重綁定)
- 18. WPF綁定子控件的父控件
- 19. C# - 綁定一個GridView評估和演示數據,而數據源控件
- 20. C#Winforms - 表單控件數據綁定 - 如何查找源元素
- 21. C#WebBrowser控件的起源
- 22. WPF綁定源
- 23. 綁定控件到子類
- 24. 綁定用戶控件
- 25. 將XML綁定到控件
- 26. 在數據綁定控件
- 27. WPF綁定控件到DataView
- 28. Knockout嵌套控件綁定
- 29. Silverlight - 綁定到控件borderthickick
- 30. PreRender上的綁定控件
我不明白你的問題。你想選擇第一行,但問題是它被選中?澄清你的問題。 – Sebi
我想填充從第一個datagridview作出的選擇第二個datagridview。因此,當第一個datagridview從綁定源代碼控件填充時,我無法選擇該datagridview中的第一行(如果我選擇第二行它正在工作,我可以在選擇任何其他行後選擇最後一行) –