【问题标题】:C# Multiple objects in dictionaryC# 字典中的多个对象
【发布时间】:2017-03-16 09:53:30
【问题描述】:

在我的 asp.net 应用程序中,我正在从文本框中检索数据并尝试创建一个字典对象。

protected void btnAddBarcode_Click(object sender, EventArgs e)
{
    try
    {
        Dictionary<int, string> Barcodes = new Dictionary<int, string>();
        int i = Convert.ToInt32(lblItemsScanned.Text);
        if (string.IsNullOrEmpty(txtBarcode.Text.Trim()))
        {
            ShowMessage("Please enter or scan barcode");
            return;
        }
        // Saving the Barcodes at first
        else if (i < Convert.ToInt32(hdnTotalItems.Value))
        {
            i++;
            if (i == 1)
            {
                Barcodes.Add(i, txtBarcode.Text);
                lblItemsScanned.Text = i.ToString();
                Session["Barcodes"] = Barcodes;

                txtBarcode.Text = string.Empty;
                i++;
            }
        }
        else { 

        }

    }

第一次数据被保存在字典中,但第二次字典被第一个更新。我想保留它们。

任何形式的帮助都会被优雅地接受。

【问题讨论】:

  • 您每次都创建一个新实例。仅当会话中没有一个时才创建一个新的
  • 您在方法内将您的字典声明为“本地”变量。您必须将其作为字段放入对象中

标签: c# asp.net dictionary


【解决方案1】:

您定义的字典是本地方法变量,每次调用该方法时都会启动它,因此您以前的数据将丢失。事件页面不维护页面数据成员的状态。您可以将其存储在ViewStateSessionApplication 对象中,具体取决于您以后需要它的位置。您还可以考虑将其存储在数据库等持久性介质上。

如果您希望它用于同一页面,则可以使用ViewState。如果您希望它用于当前用户会话并且可以跨页面访问,那么您可以将它放在Session 中。将它放在Application 对象中将使其可以跨页面和用户访问。

您可以像这样在应用程序集合上创建属性。

public Dictionary<int, string> Barcodes
{
    get { return (Dictionary<int, string>)Application["Barcodes"]; }
    set { Application["Barcodes"] = value; }
}

【讨论】:

    【解决方案2】:

    Dictionary&lt;int, string&gt; Barcodes = new Dictionary&lt;int, string&gt;(); 每次都会执行。所以你每次都初始化会话变量。你需要先检查它是否存在。

    试试这个:

    if(Session["Barcodes"]==null)
      Session["Barcodes] = new Dictionary<int, string>();
    
    Barcodes = (Dictionary<int,string>)Session["Barcodes"];
    

    【讨论】:

      【解决方案3】:

      您的字典对象 Barcodes 在您每次单击时都会被实例化。为了避免这种情况,修改代码如下,

      protected void btnAddBarcode_Click(object sender, EventArgs e)
      {
          try
          {
              Dictionary<int, string> Barcodes = Session["Barcodes"] == null ? new Dictionary<int, string>() : (Dictionary<int,string>)Session["Barcodes"];
              int i = Convert.ToInt32(lblItemsScanned.Text);
              if (string.IsNullOrEmpty(txtBarcode.Text.Trim()))
              {
                  ShowMessage("Please enter or scan barcode");
                  return;
              }
              // Saving the Barcodes at first
              else if (i < Convert.ToInt32(hdnTotalItems.Value))
              {
                  i++;
                  if (i == 1)
                  {
                      Barcodes.Add(i, txtBarcode.Text);
                      lblItemsScanned.Text = i.ToString();
                      Session["Barcodes"] = Barcodes;
      
                      txtBarcode.Text = string.Empty;
                      i++;
                  }
              }
              else { 
      
              }
      
          }
      }
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        为此,您应该使用会话 首先,您应该将 Dictionay 保存到会话中,然后在下一个迭代中从会话中获取它 使用这个简单的代码

        if(Session["Barcodes"]==null)
          Session["Barcodes] = new Dictionary<int, string>();
        
        Barcodes = (Dictionary<int,string>)Session["Barcodes"];
        

        【讨论】:

          【解决方案5】:

          试试这个。

          protected void btnAddBarcode_Click(object sender, EventArgs e)
          {
              try
              {
                  Dictionary<int, string> Barcodes;
          
                  if (Session["Barcodes"] == null)
                  {
                      Barcodes = new Dictionary<int, string>();
                  }
                  else
                  {
                      Barcodes = (Dictionary<int, string>)Session["Barcodes"];
                  }
          
                  int i = Convert.ToInt32(lblItemsScanned.Text);
                  if (string.IsNullOrEmpty(txtBarcode.Text.Trim()))
                  {
                      ShowMessage("Please enter or scan barcode");
                      return;
                  }
                  // Saving the Barcodes at first
                  else if (i < Convert.ToInt32(hdnTotalItems.Value))
                  {
                      i++;
                      if (i == 1)
                      {
                          Barcodes.Add(i, txtBarcode.Text);
                          lblItemsScanned.Text = i.ToString();
                          Session["Barcodes"] = Barcodes;
          
                          txtBarcode.Text = string.Empty;
                          i++;
                      }
                  }
                  else 
                  { 
          
                  }
          
              }
              catch(Exception) {}
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-19
            • 1970-01-01
            相关资源
            最近更新 更多