c# - 如何在没有按钮和文本框的数据网格视图 C# win 表单中编辑 `cell[i]`?
问题描述
在 winform 上,我使用编辑器将数据网格视图绑定到 SQL Server 数据库。数据源创建了以下对象:绑定源、表适配器、表适配器管理器和绑定导航器。我的目标只是从 SQL Server 表 [getdata] 中读取信息,允许进行一些编辑,并将信息传递给数据库表 [newdata];。此外,我在视图中添加了未绑定的列。因此,有“绑定”列和未绑定列。当我运行应用程序时,数据就在那里。但是,我无法编辑任何单元格(未绑定)。网格视图只读属性设置为 false。该列的只读属性设置为 false。
我的 datagridview 代码是:
private void btnCalcSeason3_Click(object sender, EventArgs e)
{
cnn.Open();
DataTable dt = new DataTable();
SqlDataAdapter adapt = new SqlDataAdapter($@"
SELECT
Id
, Tid
, NAME
, OfferedAmount
, BondNum
, BondValue
, BondDate
, BondBank
, FinancialIndex
, CASE
WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)} THEN 1
ELSE 0
END AS LCL
, CASE
WHEN FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN 1
ELSE 0
END AS Ucl
, CASE
WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN
'داخل'
ELSE 'خارج'
END AS luresult
, IsDelete
, DeleteDisc
, CASE
WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN 1
ELSE 0
END AS valresult
, CASE
WHEN
FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)}
THEN 'پذیرش'
ELSE 'حذف'
END AS sresult
, CASE
WHEN FinancialIndex < {Convert.ToDouble(txtLcl.Text)} THEN 'حذف - فصل سوم - ماده 9 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
WHEN FinancialIndex > {Convert.ToDouble(txtUcl.Text)} THEN 'حذف - فصل سوم - ماده 10 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
WHEN
FinancialIndex < {Convert.ToDouble(txtLcl.Text)}
AND FinancialIndex > {Convert.ToDouble(txtUcl.Text)}
THEN 'حذف - فصل سوم - ماده 9و10 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
ELSE ''
END AS decription
FROM Bidder
WHERE tid = {frmDomain.ID}", cnn);
adapt.Fill(dt);
dgSeason3.DataSource = dt;
dt.Columns.Add("chbCommittee", typeof(bool), "valresult");
dt.Columns.Add("result", typeof(string), "sresult");
dt.Columns.Add("discreason", typeof(string), "decription");
cnn.Close();
dgSeason3.Columns["Id"].Visible = false;
dgSeason3.Columns["Tid"].Visible = false;
dgSeason3.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
dgSeason3.Columns["Name"].HeaderText = "نام شرکت ";
dgSeason3.Columns["OfferedAmount"].Width = 135;
dgSeason3.Columns["OfferedAmount"].HeaderText = "مبلغ پیشنهادی";
dgSeason3.Columns["FinancialIndex"].Width = 110;
dgSeason3.Columns["FinancialIndex"].HeaderText = "شاخص مالی ";
dgSeason3.Columns["Lcl"].Width = 120;
dgSeason3.Columns["Lcl"].HeaderText = "بررسی حد پایین ";
dgSeason3.Columns["Ucl"].Width = 120;
dgSeason3.Columns["Ucl"].HeaderText = "بررسی حد بالا";
dgSeason3.Columns["luresult"].Width = 120;
dgSeason3.Columns["luresult"].HeaderText = "بررسی محدوده";
dgSeason3.Columns["chbCommittee"].Width = 120;
dgSeason3.Columns["chbCommittee"].HeaderText = "نظر کمیته فنی";
dgSeason3.Columns["result"].Width = 120;
dgSeason3.Columns["result"].HeaderText = "وضعیت";
dgSeason3.Columns["discreason"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgSeason3.Columns["discreason"].HeaderText = "توضیحات";
dgSeason3.Columns["IsDelete"].Visible = false;
dgSeason3.Columns["DeleteDisc"].Visible = false;
dgSeason3.Columns["BondNum"].Visible = false;
dgSeason3.Columns["BondValue"].Visible = false;
dgSeason3.Columns["BondDate"].Visible = false;
dgSeason3.Columns["BondBank"].Visible = false;
dgSeason3.Columns["valresult"].Visible = false;
dgSeason3.Columns["sresult"].Visible = false;
dgSeason3.Columns["decription"].Visible = false;
dgSeason3.Columns["OfferedAmount"].DefaultCellStyle.Format = ("#,0");
dgSeason3.Columns["BondValue"].DefaultCellStyle.Format = ("#,0");
dgSeason3.ReadOnly = false;
}
解决方案
您将不正确的列名绑定到网格列。
您正在使用DataTable.Columns.Add(string? columnName, Type type, string expression)
重载:
dt.Columns.Add("chbCommittee", typeof(bool), "valresult");
dt.Columns.Add("result", typeof(string), "sresult");
dt.Columns.Add("discreason", typeof(string), "decription");
列名应该是"chbCommittee"
, "result"
,"discreason"
但您一直"Expression"
在网格中使用 :
dgSeason3.Columns["valresult"].Visible = false;
dgSeason3.Columns["sresult"].Visible = false;
dgSeason3.Columns["decription"].Visible = false;
修理:
dgSeason3.Columns["chbCommittee"].Visible = false;
dgSeason3.Columns["result"].Visible = false;
dgSeason3.Columns["discreason"].Visible = false;
额外的:
正如评论中提到的,您的代码容易发生SQL 注入。您应该AddWithValue
改用(或SqlParameterCollection.Add 方法AddWithValue
,因为@AlexanderPetrov 在他的评论中指出的问题。):
如果您有一个模型列表,然后将其绑定List<BidderModels>
到您的dgSeason3.DataSource
:
public class BidderModel {
public string Id { get; set; } //change `string` into whatever data type your `Id` column is
public string Tid { get; set; } //change `string` into whatever data type your `Tid` column is
// . . . . your "bound" columns
// . . . . your "unbound" columns
}
然后你可以使用上面的模型,如下所示:
private void btnCalcSeason3_Click(object sender, EventArgs e)
{
cnn.Open();
DataTable dt = new DataTable();
SqlDataAdapter adapt = new SqlDataAdapter($@"your query", cnn);
adapt.Fill(dt);
cnn.Close();
List<BidderModel> bidders = new List<BidderModel>();
foreach(DataRow dr in dt.Rows) // dt is a DataTable
{
bidders.Add(new BidderModel() {
Id = int.Parse(dr["Id"].ToString()),
Name = dr["Name"].ToString(),
// . . . and so on and so forth
});
}
dgSeason3.DataSource = bidders;
}
推荐阅读
- angular - 如何解决日历问题,导致它不选择未来?
- post - 邮递员 - 无法发送 Post Twilio API 请求
- tensorflow - nvidia-smi gpu-util 含义
- android - 如何在新安装的 chromium(for android) 浏览器启动时抑制欢迎说明和登录表单
- spring-boot - javax.jms.JMSException:检测到重复的持久订阅
- ios - 在 ios 中使用 swift 处理来自自定义视图控制器的点击
- javascript - 抓取浏览器控制台输出 - Python Selenium - TCF API
- stored-procedures - DB2 简单选择 SP
- soap - php用ns解析soap响应
- google-chrome-extension - 只允许特定的人通过特定电子邮件(例如“@something.com”)查看和使用 Chrome 扩展程序