我有一个表单,系统管理员使用保存按钮将数据输入到tblministries表(例如A B C D E F)。当表单加载时,A B C D E F加载到checkedlistbox(cblMinistries)。用户可以检查checkedlistbox中的任何数据(例如B C F),然后使用用户成员ID将其保存到tblMembershipministry表中。当成员输入其ID并单击搜索按钮时,表单应将A B C D E F加载到checkedlistbox中,并且应在checklistbox中检查来自tblMembershipministry表(B C F)的具有相同成员ID的任何数据。 我的问题是我不断收到错误“无法将对象强制转换为'System.String'以在此代码行上键入'System.Data.DataRowView'”DataRowView row =(DataRowView)this.cblMinistries.Items [i] ;“请帮帮我
用于填充核对表列表的代码
public void PopuMinistry()
{
SqlConnection conn = new SqlConnection("Data Source=USER-PC;Initial Catalog=PIWCDB;User ID=sa;Password=mike");
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
string SqlDataPull = ("select Homecellname from tblministries order by Homecellname");
SqlCommand cmd = new SqlCommand(SqlDataPull);
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
SqlDataPull = dr[0].ToString();
cblMinistries.Items.Add(SqlDataPull);
}
dr.Close();
}
将checklistbox项目标记为已检查的代码
public void minsearch()
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
conn.ConnectionString = "Data Source=USER-PC;Initial Catalog=PIWCDB;User ID=sa;Password=mike";
conn.Open();
string sqlQuery = "SELECT Ministryname FROM tblMembershipministry WHERE FormattedMembershipid = '" + this.txtMembershipid.Text + "'";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlQuery;
cmd.CommandType = System.Data.CommandType.Text;
try
{
System.Data.SqlClient.SqlDataReader dr = null;
dr = cmd.ExecuteReader();
while (dr.Read())
{
for (int i = 0; i < cblMinistries.Items.Count; i++)
{
DataRowView row = (DataRowView)this.cblMinistries.Items[i];
if (row[cblMinistries.ValueMember].ToString() == dr["Ministryname"].ToString())
{
cblMinistries.SetItemChecked(i, true);
}
}
}
dr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
答案 0 :(得分:1)
string SqlDataPull = ("select Homecellname from tblministries order by Homecellname");
...
cblMinistries.Items.Add(SqlDataPull);
因此,
DataRowView row = (DataRowView)this.cblMinistries.Items[i]
正在尝试将字符串转换为DataRowView
。
也许以下内容可行:
string ministryValue = this.cblMinistries.Items[i] ;
if (ministryValue == dr["Ministryname"].ToString())
{
cblMinistries.SetItemChecked(i, true);
}
答案 1 :(得分:0)
已检查的列表框未填充数据行,但读取器返回的第一列的字符串(Homecellname
)。
这意味着,您可以直接将项目转换为字符串,前提是您需要该值(在代码中使用cblMinistries.ValueMember,我假设它引用了Homecellname)
string tofind = dr["Ministryname"].ToString();
for (int i = 0; i < cblMinistries.Items.Count; i++)
{
string ministry = (string)this.cblMinistries.Items[i];
if (ministry == tofind)
{
cblMinistries.SetItemChecked(i, true);
}
}