简体   繁体   English

C#DataGridView绑定列表

[英]C# DataGridView BindingList

Could someone help me with explaining why I'm getting a null value for DataBoundItem in the following code: 有人可以帮助我解释一下为什么我在以下代码中为DataBoundItem获取空值的原因:

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 . 您需要将DataBoundItem IInstance转换为IInstance类型, IInstance不是DataRowView类型。

The 'as' opeartor will return null if the type conversion fails. 如果类型转换失败,则“ as”操作者将返回null 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: 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: 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());
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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