【问题标题】:How to get selected row's all column values of dataGridView in TextBoxes如何在TextBoxes中获取所选行的dataGridView的所有列值
【发布时间】:2018-06-25 08:49:15
【问题描述】:

我正在开发 Windows 窗体应用程序。

它包含两个表单 MainForm - Test 和 childForm - Search

搜索表单有dataGridView控件。它包含SrNo、TypeNo、TestEngineer和Date等列。 测试表单包含文本框 tb_SerialNo, tb_TypeNo, tb_TestEngineer, datTimePicker for date。

我的主要问题是当我从 datagridview 中选择行时,我想要文本框 tb_SerialNo 中该行的 SrNo 列值。所有人都一样。

我写了以下代码。但它只给了我 tb_SerialNo 中的 SrNo 值。但我没有在各自的文本框中得到 TypeNo、TestEnginer 和日期值。我无法找到我所缺少的。请帮我解决这个问题。提前致谢。

mainForm - 测试代码

private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
    {
        SearchTest Search = new SearchTest(dt);
        Search.ShowDialog();
        dt.DefaultView.RowFilter = "";
        tb_SerialNo.Text = Search.SerialNo;
        Search.typeNo = tb_TypeNo.Text;
        Search.TestEngineer = tb_TestEngineer.Text;
        Search.Date = dateTimePicker1.Text;
    }

ChildForm -SearTest 代码:

public partial class SearchTest : Form
{
    public SearchTest(DataTable TestData)
    {
        InitializeComponent();
        dataGridView1.DataSource = TestData;
        this.dataGridView1.Sort(this.dataGridView1.Columns["SrNo"], ListSortDirection.Ascending);
    }


    private void btn_Search_Click(object sender, EventArgs e)
    {
        string str = dateTimePicker1.Text;
        string str1 = dateTimePicker2.Text;

        DateTime date = DateTime.ParseExact(str, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
        DateTime date1 = DateTime.ParseExact(str1, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
        string dtFilter = string.Format("[Date] >= '{0} ' AND [Date] <= '{1} '", date.ToString("MM/dd/yyyy"), date1.ToString("MM/dd/yyyy"));
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = dtFilter;

    }

    private void tb_SearchSrNo_TextChanged(object sender, EventArgs e)
    {
        try
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = String.IsNullOrEmpty(tb_SearchSrNo.Text) ?
                "SrNo IS NOT NULL" :
                String.Format("SrNo LIKE '{0}%' OR SrNo LIKE '{1}%' OR SrNo LIKE '{2}%'", tb_SearchSrNo.Text, tb_SearchSrNo.Text, tb_SearchSrNo.Text);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void SearchTest_Load(object sender, EventArgs e)
    {
        groupBox1.Enabled = false;
        groupBox3.Enabled = false;
        cb_Filter.MouseWheel += new MouseEventHandler(cb_Filter_MouseWheel);
    }

    private void cb_Filter_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (cb_Filter.SelectedIndex == 0)
        {
            groupBox1.Enabled = true;
        }
        else
        {
            groupBox3.Enabled = true;
        }
    }
    void cb_Filter_MouseWheel(object sender, MouseEventArgs e)
    {
        ((HandledMouseEventArgs)e).Handled = true;
    }

    private string SrNo;
    private string TypeNo;
    private string TestEng;
    private string date;

    public string SerialNo
    {
        get { return SrNo; }
        set { SrNo = value; }
    }
    public string typeNo
    {
        get { return TypeNo; }
        set { TypeNo = value; }
    }
    public string TestEngineer
    {
        get { return TestEng; }
        set { TestEng = value; }
    }
    public string Date
    {
        get { return date; }
        set { date = value; }
    }
    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        SrNo = dataGridView1.CurrentRow.Cells["SrNo"].Value.ToString();
        TypeNo = dataGridView1.CurrentRow.Cells["TypeNo"].Value.ToString();
        TestEng = dataGridView1.CurrentRow.Cells["TestEngineer"].Value.ToString();
        date = dataGridView1.CurrentRow.Cells["Date"].Value.ToString();
    }

}

【问题讨论】:

  • 您不应该编辑问题并完全改变它。它使现有的答案和 cmets 变得毫无意义。如果您对 cme​​ts 有任何问题,请在 cmets 中继续讨论或提出新问题。我将问题恢复为原始版本。
  • 对于面向数据的应用程序,您会发现this postthis one 很有用。
  • 希望你能理解我的评论。编辑问题是完全可以的,但你不应该通过改变它来使它成为一个全新的问题:)

标签: c# winforms datagridview datatable textbox


【解决方案1】:

您可以将属性定义更改为如下内容:

public string SomeProperty
{
    get 
    { 
        string value = null;
        if(BindingContext[dataGridView1.DataSource].Current !=null)
        {  
           var r = ((DataRowView)BindingContext[dataGridView1.DataSource].Current).Row;    
           value = r.Field<string>("SomeDataColumn");
        }
        return value;
    }
}

这样,SomeProperty 将始终从活动行返回 SomeDataColumn 的值。

【讨论】:

  • 我无法直接访问子表单中的父表单文本框。为此我创建了属性。
  • 我的问题搞错了。您不能使用数据绑定。
  • 改变了答案。
  • 虽然你仍然可以使用数据绑定,但这不是一个好主意。
  • 其实我在 mainForm 代码中发现了我的错误。所以昨天,我使用了我上面的答案代码。但现在我今天尝试了你的解决方案。我发现它更好。如果我使用此属性定义,则无需使用 selectionChanged 事件。
【解决方案2】:

尝试改用 SelectedRow。
SelectedRow 和 CurrentRow 的区别:

  • CurrentRow 是鼠标光标所在的位置,由系统选择。
  • SelectedRow 是在 datagridview 中选择的行,并且始终由用户选择。

这是一个示例代码:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.SelectedCells.Count > 0)
    {
        int index = dataGridView1.SelectedCells[0].RowIndex;
        DataGridViewRow selectedRow = dataGridView1.Rows[index];

        SrNo = selectedRow.Cells["SrNo"].Value.ToString();
        TypeNo = selectedRowCells["TypeNo"].Value.ToString();
        TestEng = selectedRowCells["TestEngineer"].Value.ToString();
        date = selectedRowCells["Date"].Value.ToString();
    }
}

【讨论】:

  • 您对current row 的描述有误。当前行是包含当前活动单元格的行。而且最好使用当前行。
  • @Joseph Joshua Anggita - 上面的代码不起作用。它给了我与我在上面的问题中提到的相同的结果。
【解决方案3】:

我得到了答案,我的问题得到了解决。我在 mainForm - 测试代码中发现了我的错误。我以错误的方式使用了 typeNo、TestEngineer 和日期的属性,序列号除外。这就是为什么我没有在各自的文本框中得到值。

更正后的 MainForm - 测试代码:

private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
    SearchTest Search = new SearchTest(dt);
    Search.ShowDialog();
    dt.DefaultView.RowFilter = "";

    tb_SerialNo.Text = Search.SerialNo;
    tb_TypeNo.Text = Search.typeNo;
    tb_TestEngineer.Text = Search.TestEngineer;
    dateTimePicker1.Text = Search.Date;
}

无需对搜索表单进行任何更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多