简体   繁体   中英

C# DataGridView BindingList

Could someone help me with explaining why I'm getting a null value for DataBoundItem in the following code:

public partial class ucInstanceSearch : UserControl
{
    private IStorage tempStorage;
    private BindingList<IInstance> instanceData;

    public ucInstanceSearch(IStorage new_Storage)
    {
        InitializeComponent();

        this.tempStorage = new_Storage;

        instanceData = new BindingList<IInstance>(tempStorage.Instance);

        InitalizeInstanceTable();
    }

    private void InitalizeInstanceTable()
    {
        dgInstanceTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        dgInstanceTable.MultiSelect = false;
       dgInstanceTable.AutoGenerateColumns = false;
        dgInstanceTable.RowHeadersVisible = false;

        dgInstanceTable.DataSource = instanceData;
    }

    private void PopulateInstanceTable(String searchFilter)
    {
        dgInstanceTable.Update();
    }

    private void dgInstanceTable_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void btnSearch_Click(object sender, EventArgs e)
    {
        if (txtSearch.Text != "")
        {
            PopulateInstanceTable(txtSearch.Text);
        }
        else
        {
            MessageBox.Show("Enter Data");
        }
    }

    private void btnSelect_Click(object sender, EventArgs e)
    {
        MessageBox.Show(dgInstanceTable.SelectedRows[0].Cells[2].Value + string.Empty);

        DataRow row = (dgInstanceTable.SelectedRows[0].DataBoundItem as DataRowView).Row;
        IInstance selected = (IInstance)row;


        textBox1.Text = selected.URL; 
    }

    private void ucInstanceSearch_Load(object sender, EventArgs e)
    {

    }


}

You need to cast your DataBoundItem to type IInstance not DataRowView .

The 'as' opeartor will return null if the type conversion fails. It's safer to cast this directly to the type you expect so that your code will fail if you make a mistake.

I didn't notice a data source in your script. Can you try this?

SQL Server:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        string connetionString;
        SqlConnection connection;
        SqlDataAdapter adapter;
        SqlCommandBuilder cmdBuilder;
        DataSet ds = new DataSet();
        DataSet changes;
        string Sql;
        Int32 i; 

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password";
            connection = new SqlConnection(connetionString);
            Sql = "select * from Product";
            try
            {
                connection.Open();
                adapter = new SqlDataAdapter(Sql, connection);
                adapter.Fill(ds);
                connection.Close();
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show (ex.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                cmdBuilder = new SqlCommandBuilder(adapter);
                changes = ds.GetChanges();
                if (changes != null)
                {
                    adapter.Update(changes);
                }
                MessageBox.Show("Changes Done");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

MS Access:

using System;
using System.Data;
using System.Data.OleDb; 
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        string connetionString;
        OleDbConnection connection;
        OleDbDataAdapter oledbAdapter;
        OleDbCommandBuilder oledbCmdBuilder;
        DataSet ds = new DataSet();
        DataSet changes;
        int i;
        string Sql;


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;";
            connection = new OleDbConnection(connetionString);
            Sql = "select * from tblUsers";
            try
            {
                connection.Open();
                oledbAdapter = new OleDbDataAdapter(Sql, connection);
                oledbAdapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show (ex.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                oledbCmdBuilder = new OleDbCommandBuilder(oledbAdapter);
                changes = ds.GetChanges();
                if (changes != null)
                {
                    oledbAdapter.Update(ds.Tables[0]);
                }
                ds.AcceptChanges();
                MessageBox.Show("Save changes");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM